diff options
-rw-r--r-- | config.hin | 3 | ||||
-rw-r--r-- | configure.in | 8 | ||||
-rw-r--r-- | doc/reference.html | 34 | ||||
-rw-r--r-- | lib/Makefile.in | 18 | ||||
-rw-r--r-- | lib/expat.h | 163 | ||||
-rw-r--r-- | lib/xmlparse.c | 321 |
6 files changed, 316 insertions, 231 deletions
@@ -49,8 +49,6 @@ /* Version number of package */ #undef VERSION -#include <stdlib.h> - #define XML_NS #define XML_DTD @@ -68,5 +66,6 @@ #else #define memmove(d,s,l) ;punting on memmove; #endif + #endif diff --git a/configure.in b/configure.in index 782a3b2..1bfa672 100644 --- a/configure.in +++ b/configure.in @@ -19,12 +19,20 @@ EXPAT_VERSION=$EXPAT_MAJOR_VERSION.$EXPAT_MINOR_VERSION VERSION=$EXPAT_VERSION PACKAGE=expat +LIBCURRENT=0 +LIBREVISION=0 +LIBAGE=0 + AC_CONFIG_HEADER(config.h:config.hin) AC_PROG_LIBTOOL AC_SUBST(PACKAGE) AC_SUBST(VERSION) +AC_SUBST(LIBCURRENT) +AC_SUBST(LIBREVISION) +AC_SUBST(LIBAGE) + dnl Checks for programs. AC_PROG_CC AC_PROG_INSTALL diff --git a/doc/reference.html b/doc/reference.html index 8f5a2b2..59e4390 100644 --- a/doc/reference.html +++ b/doc/reference.html @@ -110,7 +110,6 @@ copyright and to distribute it with expat. <li><a href="#XML_GetIdAttributeIndex">XML_GetIdAttributeIndex</a></li> <li><a href="#XML_SetEncoding">XML_SetEncoding</a></li> <li><a href="#XML_SetParamEntityParsing">XML_SetParamEntityParsing</a></li> - <li><a href="#XML_ContentFree">XML_ContentFree</a></li> </ul> </li> </ul> @@ -564,6 +563,28 @@ of the namespace URI, <em>sep</em>, and the local part of the name. This means that you should pick a character for <em>sep</em> that can't be part of a legal URI.</div> +<div class="fcndec"><a name="XML_ParserCreate_MM"><pre> +XML_Parser +XML_ParserCreate_MM(const XML_Char *encoding, + const XML_Memory_Handling_Suite *ms, + const XML_Char *sep) +</pre></a></div> +<div class="fcndef"> +<p>Construct a new parser using the suite of memory handling functions +specified in <code>ms</code>. If <code>ms</code> is NULL, then use the +standard set of memory management functions. If <code>sep</code> is +non NULL, then namespace processing is enabled in the created parser +and the character pointed at by sep is used as the separator between +the namespace URI and the local part of the name</p> +<div class="eg"><pre> +typedef struct { + void *(*malloc_fcn)(size_t size); + void *(*realloc_fcn)(void *ptr, size_t size); + void (*free_fcn)(void *ptr); +} XML_Memory_Handling_Suite; +</pre></div> +</div> + <div class="fcndec"><a name="XML_ExternalEntityParserCreate"><pre> XML_Parser XML_ExternalEntityParserCreate(XML_Parser p, @@ -1071,8 +1092,7 @@ struct XML_cp { <p>Sets a handler for element declarations in a DTD. The handler gets called with the name of the element in the declaration and a pointer to a structure that contains the element model. It is the application's responsibility to -free this data structure by calling -<a href="#XML_ContentFree">XML_ContentFree</a>.</p> +free this data structure.</p> <p>The <code>model</code> argument is the root of a tree of <code>XML_Content</code> nodes. If <code>type</code> equals @@ -1415,13 +1435,5 @@ The choices for <code>code</code> are: </ul> </div> -<div class="fcndec"><a name="XML_ContentFree"><pre> -void -XML_ContentFree(XML_Content *content); -</pre></a></div> -<div class="fcndef"> -Free the model data structure passed to an element declaration handler. -</div> - </body> </html> diff --git a/lib/Makefile.in b/lib/Makefile.in index 2481193..b9b4252 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -80,15 +80,20 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/conftools/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = -DEFS = @DEFS@ -I. -I$(srcdir) -I.. +DEFS = @DEFS@ -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ CFLAGS = @CFLAGS@ + +LIBREVISION = @LIBREVISION@ +LIBCURRENT = @LIBCURRENT@ +LIBAGE = @LIBAGE@ + COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(CFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --mode=link $(CCLD) -version-info $(LIBCURRENT):$(LIBREVISION):$(LIBAGE) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = Makefile.in @@ -169,10 +174,13 @@ distdir: $(DISTFILES) fi; \ done -xmlparse.o: xmlparse.c expat.h xmlrole.h xmltok.h $(top_builddir)/config.h +xmlparse.o \ +xmlparse.lo: xmlparse.c expat.h xmlrole.h xmltok.h $(top_builddir)/config.h -xmlrole.o: xmlrole.c ascii.h xmldef.h xmlrole.h $(top_builddir)/config.h +xmlrole.o \ +xmlrole.lo: xmlrole.c ascii.h xmldef.h xmlrole.h $(top_builddir)/config.h -xmltok.o: xmltok.c xmltok_impl.c xmltok_ns.c \ +xmltok.o \ +xmltok.lo: xmltok.c xmltok_impl.c xmltok_ns.c \ ascii.h asciitab.h iasciitab.h latin1tab.h nametab.h utf8tab.h \ xmldef.h xmltok.h xmltok_impl.h $(top_builddir)/config.h diff --git a/lib/expat.h b/lib/expat.h index 6a8d994..612c6a7 100644 --- a/lib/expat.h +++ b/lib/expat.h @@ -6,48 +6,18 @@ See the file COPYING for copying permission. #ifndef XmlParse_INCLUDED #define XmlParse_INCLUDED 1 +#include <stdlib.h> + #ifdef __cplusplus extern "C" { #endif -#ifndef XMLPARSEAPI -#define XMLPARSEAPI /* as nothing */ -#endif - typedef void *XML_Parser; -#ifdef XML_UNICODE_WCHAR_T - -/* XML_UNICODE_WCHAR_T will work only if sizeof(wchar_t) == 2 and wchar_t -uses Unicode. */ -/* Information is UTF-16 encoded as wchar_ts */ - -#ifndef XML_UNICODE -#define XML_UNICODE -#endif - -#include <stddef.h> -typedef wchar_t XML_Char; -typedef wchar_t XML_LChar; - -#else /* not XML_UNICODE_WCHAR_T */ - -#ifdef XML_UNICODE - -/* Information is UTF-16 encoded as unsigned shorts */ -typedef unsigned short XML_Char; -typedef char XML_LChar; - -#else /* not XML_UNICODE */ - /* Information is UTF-8 encoded. */ typedef char XML_Char; typedef char XML_LChar; -#endif /* not XML_UNICODE */ - -#endif /* not XML_UNICODE_WCHAR_T */ - enum XML_Content_Type { XML_CTYPE_EMPTY = 1, XML_CTYPE_ANY, @@ -95,21 +65,17 @@ struct XML_cp { /* This is called for an element declaration. See above for description of the model argument. It's the caller's responsibility - to free model when finished with it by calling XML_ContentFree. + to free model when finished with it. */ typedef void (*XML_ElementDeclHandler) (void *userData, const XML_Char *name, XML_Content *model); -void XMLPARSEAPI +void XML_SetElementDeclHandler(XML_Parser parser, XML_ElementDeclHandler eldecl); - -void XMLPARSEAPI -XML_ContentFree(XML_Content *content); - /* The Attlist declaration handler is called for *each* attribute. So a single Attlist declaration with multiple attributes declared will @@ -127,7 +93,7 @@ typedef void (*XML_AttlistDeclHandler) (void *userData, const XML_Char *dflt, int isrequired); -void XMLPARSEAPI +void XML_SetAttlistDeclHandler(XML_Parser parser, XML_AttlistDeclHandler attdecl); @@ -145,17 +111,21 @@ typedef void (*XML_XmlDeclHandler) (void *userData, const XML_Char *encoding, int standalone); - - -void XMLPARSEAPI +void XML_SetXmlDeclHandler(XML_Parser parser, XML_XmlDeclHandler xmldecl); +typedef struct { + void *(*malloc_fcn)(size_t size); + void *(*realloc_fcn)(void *ptr, size_t size); + void (*free_fcn)(void *ptr); +} XML_Memory_Handling_Suite; + /* Constructs a new parser; encoding is the encoding specified by the external protocol or null if there is none specified. */ -XML_Parser XMLPARSEAPI +XML_Parser XML_ParserCreate(const XML_Char *encoding); /* Constructs a new parser and namespace processor. Element type names @@ -168,10 +138,25 @@ the namespace URI and the local part will be concatenated without any separator. When a namespace is not declared, the name and prefix will be passed through without expansion. */ -XML_Parser XMLPARSEAPI +XML_Parser XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); +/* Constructs a new parser using the memory management suit referred to + by memsuite. If memsuite is NULL, then use the standard library memory + suite. If namespaceSeparator is non-NULL it creates a parser with + namespace processing as described above. The character pointed at + will serve as the namespace separator. + + All further memory operations used for the created parser will come from + the given suite. +*/ + +XML_Parser +XML_ParserCreate_MM(const XML_Char *encoding, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *namespaceSeparator); + /* atts is array of name/value pairs, terminated by 0; names and values are 0 terminated. */ @@ -255,7 +240,7 @@ typedef void (*XML_EntityDeclHandler) (void *userData, const XML_Char *publicId, const XML_Char *notationName); -void XMLPARSEAPI +void XML_SetEntityDeclHandler(XML_Parser parser, XML_EntityDeclHandler handler); @@ -398,104 +383,104 @@ typedef int (*XML_UnknownEncodingHandler)(void *encodingHandlerData, const XML_Char *name, XML_Encoding *info); -void XMLPARSEAPI +void XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end); -void XMLPARSEAPI +void XML_SetStartElementHandler(XML_Parser parser, XML_StartElementHandler); -void XMLPARSEAPI +void XML_SetEndElementHandler(XML_Parser parser, XML_EndElementHandler); -void XMLPARSEAPI +void XML_SetCharacterDataHandler(XML_Parser parser, XML_CharacterDataHandler handler); -void XMLPARSEAPI +void XML_SetProcessingInstructionHandler(XML_Parser parser, XML_ProcessingInstructionHandler handler); -void XMLPARSEAPI +void XML_SetCommentHandler(XML_Parser parser, XML_CommentHandler handler); -void XMLPARSEAPI +void XML_SetCdataSectionHandler(XML_Parser parser, XML_StartCdataSectionHandler start, XML_EndCdataSectionHandler end); -void XMLPARSEAPI +void XML_SetStartCdataSectionHandler(XML_Parser parser, XML_StartCdataSectionHandler start); -void XMLPARSEAPI +void XML_SetEndCdataSectionHandler(XML_Parser parser, XML_EndCdataSectionHandler end); /* This sets the default handler and also inhibits expansion of internal entities. The entity reference will be passed to the default handler. */ -void XMLPARSEAPI +void XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler); /* This sets the default handler but does not inhibit expansion of internal entities. The entity reference will not be passed to the default handler. */ -void XMLPARSEAPI +void XML_SetDefaultHandlerExpand(XML_Parser parser, XML_DefaultHandler handler); -void XMLPARSEAPI +void XML_SetDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start, XML_EndDoctypeDeclHandler end); -void XMLPARSEAPI +void XML_SetStartDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start); -void XMLPARSEAPI +void XML_SetEndDoctypeDeclHandler(XML_Parser parser, XML_EndDoctypeDeclHandler end); -void XMLPARSEAPI +void XML_SetUnparsedEntityDeclHandler(XML_Parser parser, XML_UnparsedEntityDeclHandler handler); -void XMLPARSEAPI +void XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler); -void XMLPARSEAPI +void XML_SetNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start, XML_EndNamespaceDeclHandler end); -void XMLPARSEAPI +void XML_SetStartNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start); -void XMLPARSEAPI +void XML_SetEndNamespaceDeclHandler(XML_Parser parser, XML_EndNamespaceDeclHandler end); -void XMLPARSEAPI +void XML_SetNotStandaloneHandler(XML_Parser parser, XML_NotStandaloneHandler handler); -void XMLPARSEAPI +void XML_SetExternalEntityRefHandler(XML_Parser parser, XML_ExternalEntityRefHandler handler); /* If a non-null value for arg is specified here, then it will be passed as the first argument to the external entity ref handler instead of the parser object. */ -void XMLPARSEAPI +void XML_SetExternalEntityRefHandlerArg(XML_Parser, void *arg); -void XMLPARSEAPI +void XML_SetUnknownEncodingHandler(XML_Parser parser, XML_UnknownEncodingHandler handler, void *encodingHandlerData); @@ -503,10 +488,10 @@ XML_SetUnknownEncodingHandler(XML_Parser parser, /* This can be called within a handler for a start element, end element, processing instruction or character data. It causes the corresponding markup to be passed to the default handler. */ -void XMLPARSEAPI XML_DefaultCurrent(XML_Parser parser); +void XML_DefaultCurrent(XML_Parser parser); /* This value is passed as the userData argument to callbacks. */ -void XMLPARSEAPI +void XML_SetUserData(XML_Parser parser, void *userData); /* Returns the last value set by XML_SetUserData or null. */ @@ -516,14 +501,14 @@ XML_SetUserData(XML_Parser parser, void *userData); to XML_ParserCreate. It must not be called after XML_Parse or XML_ParseBuffer. */ -int XMLPARSEAPI +int XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); /* If this function is called, then the parser will be passed as the first argument to callbacks instead of userData. The userData will still be accessible using XML_GetUserData. */ -void XMLPARSEAPI +void XML_UseParserAsHandlerArg(XML_Parser parser); /* Sets the base to be used for resolving relative URIs in system identifiers in @@ -533,10 +518,10 @@ XML_ExternalEntityRefHandler, XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base argument will be copied. Returns zero if out of memory, non-zero otherwise. */ -int XMLPARSEAPI +int XML_SetBase(XML_Parser parser, const XML_Char *base); -const XML_Char XMLPARSEAPI * +const XML_Char * XML_GetBase(XML_Parser parser); /* Returns the number of the attribute/value pairs passed in last call @@ -545,24 +530,24 @@ rather than defaulted. Each attribute/value pair counts as 2; thus this correspondds to an index into the atts array passed to the XML_StartElementHandler. */ -int XMLPARSEAPI XML_GetSpecifiedAttributeCount(XML_Parser parser); +int XML_GetSpecifiedAttributeCount(XML_Parser parser); /* Returns the index of the ID attribute passed in the last call to XML_StartElementHandler, or -1 if there is no ID attribute. Each attribute/value pair counts as 2; thus this correspondds to an index into the atts array passed to the XML_StartElementHandler. */ -int XMLPARSEAPI XML_GetIdAttributeIndex(XML_Parser parser); +int XML_GetIdAttributeIndex(XML_Parser parser); /* Parses some input. Returns 0 if a fatal error is detected. The last call to XML_Parse must have isFinal true; len may be zero for this call (or any other). */ -int XMLPARSEAPI +int XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); -void XMLPARSEAPI * +void * XML_GetBuffer(XML_Parser parser, int len); -int XMLPARSEAPI +int XML_ParseBuffer(XML_Parser parser, int len, int isFinal); /* Creates an XML_Parser object that can parse an external general entity; @@ -578,7 +563,7 @@ so longer as the parser has not yet been freed. The new parser is completely independent and may safely be used in a separate thread. The handlers and userData are initialized from the parser argument. Returns 0 if out of memory. Otherwise returns a new XML_Parser object. */ -XML_Parser XMLPARSEAPI +XML_Parser XML_ExternalEntityParserCreate(XML_Parser parser, const XML_Char *context, const XML_Char *encoding); @@ -608,7 +593,7 @@ parsing (ie without XML_DTD being defined), then XML_SetParamEntityParsing will return 0 if parsing of parameter entities is requested; otherwise it will return non-zero. */ -int XMLPARSEAPI +int XML_SetParamEntityParsing(XML_Parser parser, enum XML_ParamEntityParsing parsing); @@ -641,7 +626,7 @@ enum XML_Error { /* If XML_Parse or XML_ParseBuffer have returned 0, then XML_GetErrorCode returns information about the error. */ -enum XML_Error XMLPARSEAPI XML_GetErrorCode(XML_Parser parser); +enum XML_Error XML_GetErrorCode(XML_Parser parser); /* These functions return information about the current parse location. They may be called when XML_Parse or XML_ParseBuffer return 0; @@ -651,14 +636,14 @@ They may also be called from any other callback called to report some parse event; in this the location is the location of the first of the sequence of characters that generated the event. */ -int XMLPARSEAPI XML_GetCurrentLineNumber(XML_Parser parser); -int XMLPARSEAPI XML_GetCurrentColumnNumber(XML_Parser parser); -long XMLPARSEAPI XML_GetCurrentByteIndex(XML_Parser parser); +int XML_GetCurrentLineNumber(XML_Parser parser); +int XML_GetCurrentColumnNumber(XML_Parser parser); +long XML_GetCurrentByteIndex(XML_Parser parser); /* Return the number of bytes in the current event. Returns 0 if the event is in an internal entity. */ -int XMLPARSEAPI XML_GetCurrentByteCount(XML_Parser parser); +int XML_GetCurrentByteCount(XML_Parser parser); /* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets the integer pointed to by offset to the offset within this buffer @@ -669,7 +654,7 @@ int XMLPARSEAPI XML_GetCurrentByteCount(XML_Parser parser); NOTE: The character pointer returned should not be used outside the handler that makes the call. */ -const char XMLPARSEAPI * XML_GetInputContext(XML_Parser parser, +const char * XML_GetInputContext(XML_Parser parser, int *offset, int *size); @@ -679,11 +664,11 @@ const char XMLPARSEAPI * XML_GetInputContext(XML_Parser parser, #define XML_GetErrorByteIndex XML_GetCurrentByteIndex /* Frees memory used by the parser. */ -void XMLPARSEAPI +void XML_ParserFree(XML_Parser parser); /* Returns a string describing the error. */ -const XML_LChar XMLPARSEAPI *XML_ErrorString(int code); +const XML_LChar *XML_ErrorString(int code); #ifdef __cplusplus } diff --git a/lib/xmlparse.c b/lib/xmlparse.c index 89b505a..340d045 100644 --- a/lib/xmlparse.c +++ b/lib/xmlparse.c @@ -59,6 +59,7 @@ typedef struct { size_t size; size_t used; size_t usedLim; + XML_Memory_Handling_Suite *mem; } HASH_TABLE; typedef struct { @@ -139,6 +140,7 @@ typedef struct { const XML_Char *end; XML_Char *ptr; XML_Char *start; + XML_Memory_Handling_Suite *mem; } STRING_POOL; /* The XML_Char before the name is used to determine whether @@ -237,8 +239,12 @@ static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *, const char TAG_NAME *tagNamePtr, BINDING **bindingsPtr); static int addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, const XML_Char *uri, BINDING **bindingsPtr); + static int -defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, int isCdata, int isId, const XML_Char *dfltValue); +defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, + int isCdata, int isId, const XML_Char *dfltValue, + XML_Parser parser); + static enum XML_Error storeAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *, STRING_POOL *); @@ -260,26 +266,36 @@ reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, const c static const XML_Char *getContext(XML_Parser parser); static int setContext(XML_Parser parser, const XML_Char *context); static void normalizePublicId(XML_Char *s); -static int dtdInit(DTD *); -static void dtdDestroy(DTD *); -static int dtdCopy(DTD *newDtd, const DTD *oldDtd); -static int copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); +static int dtdInit(DTD *, XML_Parser parser); + +static void dtdDestroy(DTD *, XML_Parser parser); + +static int dtdCopy(DTD *newDtd, const DTD *oldDtd, XML_Parser parser); + +static int copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *, + XML_Parser parser); + #ifdef XML_DTD static void dtdSwap(DTD *, DTD *); #endif /* XML_DTD */ + static NAMED *lookup(HASH_TABLE *table, KEY name, size_t createSize); -static void hashTableInit(HASH_TABLE *); + +static void hashTableInit(HASH_TABLE *, XML_Memory_Handling_Suite *ms); + static void hashTableDestroy(HASH_TABLE *); static void hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); static NAMED *hashTableIterNext(HASH_TABLE_ITER *); -static void poolInit(STRING_POOL *); +static void poolInit(STRING_POOL *, XML_Memory_Handling_Suite *ms); static void poolClear(STRING_POOL *); static void poolDestroy(STRING_POOL *); static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end); static XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end); + static int poolGrow(STRING_POOL *pool); + static int nextScaffoldPart(XML_Parser parser); static XML_Content *build_model(XML_Parser parser); @@ -308,6 +324,7 @@ typedef struct { void *m_userData; void *m_handlerArg; char *m_buffer; + XML_Memory_Handling_Suite m_mem; /* first character to be parsed */ const char *m_bufferPtr; /* past last character to be parsed */ @@ -392,6 +409,10 @@ typedef struct { #endif } Parser; +#define MALLOC(s) (((Parser *)parser)->m_mem.malloc_fcn((s))) +#define REALLOC(p,s) (((Parser *)parser)->m_mem.realloc_fcn((p),(s))) +#define FREE(p) (((Parser *)parser)->m_mem.free_fcn((p))) + #define userData (((Parser *)parser)->m_userData) #define handlerArg (((Parser *)parser)->m_handlerArg) #define startElementHandler (((Parser *)parser)->m_startElementHandler) @@ -487,7 +508,54 @@ Parser *asParser(XML_Parser parser) XML_Parser XML_ParserCreate(const XML_Char *encodingName) { - XML_Parser parser = malloc(sizeof(Parser)); + return XML_ParserCreate_MM(encodingName, NULL, NULL); +} + +XML_Parser XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) +{ + XML_Char tmp[2]; + *tmp = nsSep; + return XML_ParserCreate_MM(encodingName, NULL, tmp); +} + +XML_Parser +XML_ParserCreate_MM(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep) { + + XML_Parser parser; + static + const XML_Char implicitContext[] = { + XML_T('x'), XML_T('m'), XML_T('l'), XML_T('='), + XML_T('h'), XML_T('t'), XML_T('t'), XML_T('p'), XML_T(':'), + XML_T('/'), XML_T('/'), XML_T('w'), XML_T('w'), XML_T('w'), + XML_T('.'), XML_T('w'), XML_T('3'), + XML_T('.'), XML_T('o'), XML_T('r'), XML_T('g'), + XML_T('/'), XML_T('X'), XML_T('M'), XML_T('L'), + XML_T('/'), XML_T('1'), XML_T('9'), XML_T('9'), XML_T('8'), + XML_T('/'), XML_T('n'), XML_T('a'), XML_T('m'), XML_T('e'), + XML_T('s'), XML_T('p'), XML_T('a'), XML_T('c'), XML_T('e'), + XML_T('\0') + }; + + + if (memsuite) { + XML_Memory_Handling_Suite *mtemp; + parser = memsuite->malloc_fcn(sizeof(Parser)); + mtemp = &(((Parser *) parser)->m_mem); + mtemp->malloc_fcn = memsuite->malloc_fcn; + mtemp->realloc_fcn = memsuite->realloc_fcn; + mtemp->free_fcn = memsuite->free_fcn; + } + else { + XML_Memory_Handling_Suite *mtemp; + parser = malloc(sizeof(Parser)); + mtemp = &(((Parser *) parser)->m_mem); + mtemp->malloc_fcn = malloc; + mtemp->realloc_fcn = realloc; + mtemp->free_fcn = free; + } + if (!parser) return parser; processor = prologInitProcessor; @@ -543,9 +611,9 @@ XML_Parser XML_ParserCreate(const XML_Char *encodingName) freeBindingList = 0; inheritedBindings = 0; attsSize = INIT_ATTS_SIZE; - atts = malloc(attsSize * sizeof(ATTRIBUTE)); + atts = MALLOC(attsSize * sizeof(ATTRIBUTE)); nSpecifiedAtts = 0; - dataBuf = malloc(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); + dataBuf = MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); groupSize = 0; groupConnector = 0; hadExternalDoctype = 0; @@ -559,50 +627,35 @@ XML_Parser XML_ParserCreate(const XML_Char *encodingName) paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; #endif ns = 0; - poolInit(&tempPool); - poolInit(&temp2Pool); + poolInit(&tempPool, &(((Parser *) parser)->m_mem)); + poolInit(&temp2Pool, &(((Parser *) parser)->m_mem)); protocolEncodingName = encodingName ? poolCopyString(&tempPool, encodingName) : 0; curBase = 0; - if (!dtdInit(&dtd) || !atts || !dataBuf + if (!dtdInit(&dtd, parser) || !atts || !dataBuf || (encodingName && !protocolEncodingName)) { XML_ParserFree(parser); return 0; } dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; - XmlInitEncoding(&initEncoding, &encoding, 0); - internalEncoding = XmlGetInternalEncoding(); - return parser; -} - -XML_Parser XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) -{ - static - const XML_Char implicitContext[] = { - XML_T('x'), XML_T('m'), XML_T('l'), XML_T('='), - XML_T('h'), XML_T('t'), XML_T('t'), XML_T('p'), XML_T(':'), - XML_T('/'), XML_T('/'), XML_T('w'), XML_T('w'), XML_T('w'), - XML_T('.'), XML_T('w'), XML_T('3'), - XML_T('.'), XML_T('o'), XML_T('r'), XML_T('g'), - XML_T('/'), XML_T('X'), XML_T('M'), XML_T('L'), - XML_T('/'), XML_T('1'), XML_T('9'), XML_T('9'), XML_T('8'), - XML_T('/'), XML_T('n'), XML_T('a'), XML_T('m'), XML_T('e'), - XML_T('s'), XML_T('p'), XML_T('a'), XML_T('c'), XML_T('e'), - XML_T('\0') - }; - XML_Parser parser = XML_ParserCreate(encodingName); - if (parser) { + if (nameSep) { XmlInitEncodingNS(&initEncoding, &encoding, 0); ns = 1; internalEncoding = XmlGetInternalEncodingNS(); - namespaceSeparator = nsSep; + namespaceSeparator = *nameSep; + + if (! setContext(parser, implicitContext)) { + XML_ParserFree(parser); + return 0; + } } - if (!setContext(parser, implicitContext)) { - XML_ParserFree(parser); - return 0; + else { + XmlInitEncoding(&initEncoding, &encoding, 0); + internalEncoding = XmlGetInternalEncoding(); } + return parser; -} +} /* End XML_ParserCreate_MM */ int XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) { @@ -649,11 +702,22 @@ XML_Parser XML_ExternalEntityParserCreate(XML_Parser oldParser, #ifdef XML_DTD int oldParamEntityParsing = paramEntityParsing; #endif - parser = (ns - ? XML_ParserCreateNS(encodingName, namespaceSeparator) - : XML_ParserCreate(encodingName)); + + if (ns) { + XML_Char tmp[2]; + + *tmp = namespaceSeparator; + parser = XML_ParserCreate_MM(encodingName, &((Parser *)parser)->m_mem, + tmp); + } + else { + parser = XML_ParserCreate_MM(encodingName, &((Parser *)parser)->m_mem, + NULL); + } + if (!parser) return 0; + startElementHandler = oldStartElementHandler; endElementHandler = oldEndElementHandler; characterDataHandler = oldCharacterDataHandler; @@ -686,7 +750,7 @@ XML_Parser XML_ExternalEntityParserCreate(XML_Parser oldParser, paramEntityParsing = oldParamEntityParsing; if (context) { #endif /* XML_DTD */ - if (!dtdCopy(&dtd, oldDtd) || !setContext(parser, context)) { + if (!dtdCopy(&dtd, oldDtd, parser) || !setContext(parser, context)) { XML_ParserFree(parser); return 0; } @@ -705,15 +769,15 @@ XML_Parser XML_ExternalEntityParserCreate(XML_Parser oldParser, } static -void destroyBindings(BINDING *bindings) +void destroyBindings(BINDING *bindings, XML_Parser parser) { for (;;) { BINDING *b = bindings; if (!b) break; bindings = b->nextTagBinding; - free(b->uri); - free(b); + FREE(b->uri); + FREE(b); } } @@ -729,12 +793,12 @@ void XML_ParserFree(XML_Parser parser) } p = tagStack; tagStack = tagStack->parent; - free(p->buf); - destroyBindings(p->bindings); - free(p); + FREE(p->buf); + destroyBindings(p->bindings, parser); + FREE(p); } - destroyBindings(freeBindingList); - destroyBindings(inheritedBindings); + destroyBindings(freeBindingList, parser); + destroyBindings(inheritedBindings, parser); poolDestroy(&tempPool); poolDestroy(&temp2Pool); #ifdef XML_DTD @@ -744,23 +808,18 @@ void XML_ParserFree(XML_Parser parser) dtdSwap(&dtd, &((Parser *)parentParser)->m_dtd); } #endif /* XML_DTD */ - dtdDestroy(&dtd); - free((void *)atts); + dtdDestroy(&dtd, parser); + FREE((void *)atts); if (groupConnector) - free(groupConnector); + FREE(groupConnector); if (buffer) - free(buffer); - free(dataBuf); + FREE(buffer); + FREE(dataBuf); if (unknownEncodingMem) - free(unknownEncodingMem); + FREE(unknownEncodingMem); if (unknownEncodingRelease) unknownEncodingRelease(unknownEncodingData); - free(parser); -} - -void XML_ContentFree(XML_Content *content) -{ - free(content); + FREE(parser); } void XML_UseParserAsHandlerArg(XML_Parser parser) @@ -1019,7 +1078,7 @@ int XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) if (nLeftOver) { if (buffer == 0 || nLeftOver > bufferLim - buffer) { /* FIXME avoid integer overflow */ - buffer = buffer == 0 ? malloc(len * 2) : realloc(buffer, len * 2); + buffer = buffer == 0 ? MALLOC(len * 2) : REALLOC(buffer, len * 2); /* FIXME storage leak if realloc fails */ if (!buffer) { errorCode = XML_ERROR_NO_MEMORY; @@ -1096,7 +1155,7 @@ void *XML_GetBuffer(XML_Parser parser, int len) do { bufferSize *= 2; } while (bufferSize < neededSize); - newBuf = malloc(bufferSize); + newBuf = MALLOC(bufferSize); if (newBuf == 0) { errorCode = XML_ERROR_NO_MEMORY; return 0; @@ -1108,7 +1167,7 @@ void *XML_GetBuffer(XML_Parser parser, int len) if (keep > XML_CONTEXT_BYTES) keep = XML_CONTEXT_BYTES; memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep); - free(buffer); + FREE(buffer); buffer = newBuf; bufferEnd = buffer + (bufferEnd - bufferPtr) + keep; bufferPtr = buffer + keep; @@ -1120,7 +1179,7 @@ void *XML_GetBuffer(XML_Parser parser, int len) #else if (bufferPtr) { memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); - free(buffer); + FREE(buffer); } bufferEnd = newBuf + (bufferEnd - bufferPtr); bufferPtr = buffer = newBuf; @@ -1482,10 +1541,10 @@ doContent(XML_Parser parser, freeTagList = freeTagList->parent; } else { - tag = malloc(sizeof(TAG)); + tag = MALLOC(sizeof(TAG)); if (!tag) return XML_ERROR_NO_MEMORY; - tag->buf = malloc(INIT_TAG_BUF_SIZE); + tag->buf = MALLOC(INIT_TAG_BUF_SIZE); if (!tag->buf) return XML_ERROR_NO_MEMORY; tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; @@ -1502,7 +1561,7 @@ doContent(XML_Parser parser, if (tag->rawNameLength + (int)(sizeof(XML_Char) - 1) + (int)sizeof(XML_Char) > tag->bufEnd - tag->buf) { int bufSize = tag->rawNameLength * 4; bufSize = ROUND_UP(bufSize, sizeof(XML_Char)); - tag->buf = realloc(tag->buf, bufSize); + tag->buf = REALLOC(tag->buf, bufSize); if (!tag->buf) return XML_ERROR_NO_MEMORY; tag->bufEnd = tag->buf + bufSize; @@ -1529,7 +1588,7 @@ doContent(XML_Parser parser, if (fromPtr == rawNameEnd) break; bufSize = (tag->bufEnd - tag->buf) << 1; - tag->buf = realloc(tag->buf, bufSize); + tag->buf = REALLOC(tag->buf, bufSize); if (!tag->buf) return XML_ERROR_NO_MEMORY; tag->bufEnd = tag->buf + bufSize; @@ -1774,7 +1833,7 @@ static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *enc, /* lookup the element type name */ if (tagNamePtr) { - elementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, tagNamePtr->str, 0); + elementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, tagNamePtr->str,0); if (!elementType) { tagNamePtr->str = poolCopyString(&dtd.pool, tagNamePtr->str); if (!tagNamePtr->str) @@ -1792,7 +1851,7 @@ static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *enc, if (n + nDefaultAtts > attsSize) { int oldAttsSize = attsSize; attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; - atts = realloc((void *)atts, attsSize * sizeof(ATTRIBUTE)); + atts = REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); if (!atts) return XML_ERROR_NO_MEMORY; if (n > oldAttsSize) @@ -1965,7 +2024,7 @@ static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *enc, n = i + binding->uriLen; if (n > binding->uriAlloc) { TAG *p; - XML_Char *uri = malloc((n + EXPAND_SPARE) * sizeof(XML_Char)); + XML_Char *uri = MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char)); if (!uri) return XML_ERROR_NO_MEMORY; binding->uriAlloc = n + EXPAND_SPARE; @@ -1973,7 +2032,7 @@ static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *enc, for (p = tagStack; p; p = p->parent) if (p->name.str == binding->uri) p->name.str = uri; - free(binding->uri); + FREE(binding->uri); binding->uri = uri; } memcpy(binding->uri + binding->uriLen, localPart, i * sizeof(XML_Char)); @@ -1993,7 +2052,7 @@ int addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, con if (freeBindingList) { b = freeBindingList; if (len > b->uriAlloc) { - b->uri = realloc(b->uri, sizeof(XML_Char) * (len + EXPAND_SPARE)); + b->uri = REALLOC(b->uri, sizeof(XML_Char) * (len + EXPAND_SPARE)); if (!b->uri) return 0; b->uriAlloc = len + EXPAND_SPARE; @@ -2001,12 +2060,12 @@ int addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, con freeBindingList = b->nextTagBinding; } else { - b = malloc(sizeof(BINDING)); + b = MALLOC(sizeof(BINDING)); if (!b) return 0; - b->uri = malloc(sizeof(XML_Char) * (len + EXPAND_SPARE)); + b->uri = MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE)); if (!b->uri) { - free(b); + FREE(b); return 0; } b->uriAlloc = len + EXPAND_SPARE; @@ -2347,7 +2406,7 @@ handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) info.release = 0; if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, &info)) { ENCODING *enc; - unknownEncodingMem = malloc(XmlSizeOfUnknownEncoding()); + unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding()); if (!unknownEncodingMem) { if (info.release) info.release(info.data); @@ -2622,7 +2681,8 @@ doProlog(XML_Parser parser, case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: if (dtd.complete && !defineAttribute(declElementType, declAttributeId, - declAttributeIsCdata, declAttributeIsId, 0)) + declAttributeIsCdata, declAttributeIsId, 0, + parser)) return XML_ERROR_NO_MEMORY; if (attlistDeclHandler && declAttributeType) { if (*declAttributeType == '(' @@ -2656,7 +2716,7 @@ doProlog(XML_Parser parser, poolFinish(&dtd.pool); if (dtd.complete /* ID attributes aren't allowed to have a default */ - && !defineAttribute(declElementType, declAttributeId, declAttributeIsCdata, 0, attVal)) + && !defineAttribute(declElementType, declAttributeId, declAttributeIsCdata, 0, attVal, parser)) return XML_ERROR_NO_MEMORY; if (attlistDeclHandler && declAttributeType) { if (*declAttributeType == '(' @@ -2816,7 +2876,8 @@ doProlog(XML_Parser parser, const XML_Char *name = poolStoreString(&dtd.pool, enc, s, next); if (!name) return XML_ERROR_NO_MEMORY; - declEntity = (ENTITY *)lookup(&dtd.paramEntities, name, sizeof(ENTITY)); + declEntity = (ENTITY *)lookup(&dtd.paramEntities, + name, sizeof(ENTITY)); if (!declEntity) return XML_ERROR_NO_MEMORY; if (declEntity->name != name) { @@ -2912,12 +2973,12 @@ doProlog(XML_Parser parser, case XML_ROLE_GROUP_OPEN: if (prologState.level >= groupSize) { if (groupSize) { - groupConnector = realloc(groupConnector, groupSize *= 2); + groupConnector = REALLOC(groupConnector, groupSize *= 2); if (dtd.scaffIndex) - dtd.scaffIndex = realloc(dtd.scaffIndex, groupSize * sizeof(int)); + dtd.scaffIndex = REALLOC(dtd.scaffIndex, groupSize * sizeof(int)); } else - groupConnector = malloc(groupSize = 32); + groupConnector = MALLOC(groupSize = 32); if (!groupConnector) return XML_ERROR_NO_MEMORY; } @@ -3019,7 +3080,7 @@ doProlog(XML_Parser parser, case XML_ROLE_CONTENT_EMPTY: if (dtd.in_eldecl) { if (elementDeclHandler) { - XML_Content * content = (XML_Content *) malloc(sizeof(XML_Content)); + XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content)); if (! content) return XML_ERROR_NO_MEMORY; content->quant = XML_CQUANT_NONE; @@ -3571,7 +3632,8 @@ reportDefault(XML_Parser parser, const ENCODING *enc, const char *s, const char static int -defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, int isCdata, int isId, const XML_Char *value) +defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, int isCdata, + int isId, const XML_Char *value, XML_Parser parser) { DEFAULT_ATTRIBUTE *att; if (value || isId) { @@ -3587,11 +3649,11 @@ defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, int isCdata, int isId, if (type->nDefaultAtts == type->allocDefaultAtts) { if (type->allocDefaultAtts == 0) { type->allocDefaultAtts = 8; - type->defaultAtts = malloc(type->allocDefaultAtts*sizeof(DEFAULT_ATTRIBUTE)); + type->defaultAtts = MALLOC(type->allocDefaultAtts*sizeof(DEFAULT_ATTRIBUTE)); } else { type->allocDefaultAtts *= 2; - type->defaultAtts = realloc(type->defaultAtts, + type->defaultAtts = REALLOC(type->defaultAtts, type->allocDefaultAtts*sizeof(DEFAULT_ATTRIBUTE)); } if (!type->defaultAtts) @@ -3839,17 +3901,18 @@ void normalizePublicId(XML_Char *publicId) *p = XML_T('\0'); } -static int dtdInit(DTD *p) +static int dtdInit(DTD *p, XML_Parser parser) { - poolInit(&(p->pool)); - hashTableInit(&(p->generalEntities)); - hashTableInit(&(p->elementTypes)); - hashTableInit(&(p->attributeIds)); - hashTableInit(&(p->prefixes)); + XML_Memory_Handling_Suite *ms = &((Parser *) parser)->m_mem; + poolInit(&(p->pool), ms); + hashTableInit(&(p->generalEntities), ms); + hashTableInit(&(p->elementTypes), ms); + hashTableInit(&(p->attributeIds), ms); + hashTableInit(&(p->prefixes), ms); p->complete = 1; p->standalone = 0; #ifdef XML_DTD - hashTableInit(&(p->paramEntities)); + hashTableInit(&(p->paramEntities), ms); #endif /* XML_DTD */ p->defaultPrefix.name = 0; p->defaultPrefix.binding = 0; @@ -3877,7 +3940,7 @@ static void dtdSwap(DTD *p1, DTD *p2) #endif /* XML_DTD */ -static void dtdDestroy(DTD *p) +static void dtdDestroy(DTD *p, XML_Parser parser) { HASH_TABLE_ITER iter; hashTableIterInit(&iter, &(p->elementTypes)); @@ -3886,7 +3949,7 @@ static void dtdDestroy(DTD *p) if (!e) break; if (e->allocDefaultAtts != 0) - free(e->defaultAtts); + FREE(e->defaultAtts); } hashTableDestroy(&(p->generalEntities)); #ifdef XML_DTD @@ -3897,15 +3960,15 @@ static void dtdDestroy(DTD *p) hashTableDestroy(&(p->prefixes)); poolDestroy(&(p->pool)); if (p->scaffIndex) - free(p->scaffIndex); + FREE(p->scaffIndex); if (p->scaffold) - free(p->scaffold); + FREE(p->scaffold); } /* Do a deep copy of the DTD. Return 0 for out of memory; non-zero otherwise. The new DTD has already been initialized. */ -static int dtdCopy(DTD *newDtd, const DTD *oldDtd) +static int dtdCopy(DTD *newDtd, const DTD *oldDtd, XML_Parser parser) { HASH_TABLE_ITER iter; @@ -3973,7 +4036,7 @@ static int dtdCopy(DTD *newDtd, const DTD *oldDtd) if (!newE) return 0; if (oldE->nDefaultAtts) { - newE->defaultAtts = (DEFAULT_ATTRIBUTE *)malloc(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); + newE->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); if (!newE->defaultAtts) return 0; } @@ -3998,13 +4061,13 @@ static int dtdCopy(DTD *newDtd, const DTD *oldDtd) /* Copy the entity tables. */ if (!copyEntityTable(&(newDtd->generalEntities), &(newDtd->pool), - &(oldDtd->generalEntities))) + &(oldDtd->generalEntities), parser)) return 0; #ifdef XML_DTD if (!copyEntityTable(&(newDtd->paramEntities), &(newDtd->pool), - &(oldDtd->paramEntities))) + &(oldDtd->paramEntities), parser)) return 0; #endif /* XML_DTD */ @@ -4020,11 +4083,12 @@ static int dtdCopy(DTD *newDtd, const DTD *oldDtd) newDtd->scaffIndex = oldDtd->scaffIndex; return 1; -} +} /* End dtdCopy */ static int copyEntityTable(HASH_TABLE *newTable, STRING_POOL *newPool, - const HASH_TABLE *oldTable) + const HASH_TABLE *oldTable, + XML_Parser parser) { HASH_TABLE_ITER iter; const XML_Char *cachedOldBase = 0; @@ -4103,11 +4167,15 @@ NAMED *lookup(HASH_TABLE *table, KEY name, size_t createSize) { size_t i; if (table->size == 0) { + size_t tsize; + if (!createSize) return 0; - table->v = calloc(INIT_SIZE, sizeof(NAMED *)); + tsize = INIT_SIZE * sizeof(NAMED *); + table->v = table->mem->malloc_fcn(tsize); if (!table->v) return 0; + memset(table->v, 0, tsize); table->size = INIT_SIZE; table->usedLim = INIT_SIZE / 2; i = hash(name) & (table->size - 1); @@ -4125,9 +4193,11 @@ NAMED *lookup(HASH_TABLE *table, KEY name, size_t createSize) if (table->used == table->usedLim) { /* check for overflow */ size_t newSize = table->size * 2; - NAMED **newV = calloc(newSize, sizeof(NAMED *)); + size_t tsize = newSize * sizeof(NAMED *); + NAMED **newV = table->mem->malloc_fcn(tsize); if (!newV) return 0; + memset(newV, 0, tsize); for (i = 0; i < table->size; i++) if (table->v[i]) { size_t j; @@ -4137,7 +4207,7 @@ NAMED *lookup(HASH_TABLE *table, KEY name, size_t createSize) ; newV[j] = table->v[i]; } - free(table->v); + table->mem->free_fcn(table->v); table->v = newV; table->size = newSize; table->usedLim = newSize/2; @@ -4147,9 +4217,10 @@ NAMED *lookup(HASH_TABLE *table, KEY name, size_t createSize) ; } } - table->v[i] = calloc(1, createSize); + table->v[i] = table->mem->malloc_fcn(createSize); if (!table->v[i]) return 0; + memset(table->v[i], 0, createSize); table->v[i]->name = name; (table->used)++; return table->v[i]; @@ -4162,19 +4233,20 @@ void hashTableDestroy(HASH_TABLE *table) for (i = 0; i < table->size; i++) { NAMED *p = table->v[i]; if (p) - free(p); + table->mem->free_fcn(p); } if (table->v) - free(table->v); + table->mem->free_fcn(table->v); } static -void hashTableInit(HASH_TABLE *p) +void hashTableInit(HASH_TABLE *p, XML_Memory_Handling_Suite *ms) { p->size = 0; p->usedLim = 0; p->used = 0; p->v = 0; + p->mem = ms; } static @@ -4197,13 +4269,14 @@ NAMED *hashTableIterNext(HASH_TABLE_ITER *iter) static -void poolInit(STRING_POOL *pool) +void poolInit(STRING_POOL *pool, XML_Memory_Handling_Suite *ms) { pool->blocks = 0; pool->freeBlocks = 0; pool->start = 0; pool->ptr = 0; pool->end = 0; + pool->mem = ms; } static @@ -4232,14 +4305,14 @@ void poolDestroy(STRING_POOL *pool) BLOCK *p = pool->blocks; while (p) { BLOCK *tem = p->next; - free(p); + pool->mem->free_fcn(p); p = tem; } pool->blocks = 0; p = pool->freeBlocks; while (p) { BLOCK *tem = p->next; - free(p); + pool->mem->free_fcn(p); p = tem; } pool->freeBlocks = 0; @@ -4339,7 +4412,7 @@ int poolGrow(STRING_POOL *pool) } if (pool->blocks && pool->start == pool->blocks->s) { int blockSize = (pool->end - pool->start)*2; - pool->blocks = realloc(pool->blocks, offsetof(BLOCK, s) + blockSize * sizeof(XML_Char)); + pool->blocks = pool->mem->realloc_fcn(pool->blocks, offsetof(BLOCK, s) + blockSize * sizeof(XML_Char)); if (!pool->blocks) return 0; pool->blocks->size = blockSize; @@ -4354,7 +4427,7 @@ int poolGrow(STRING_POOL *pool) blockSize = INIT_BLOCK_SIZE; else blockSize *= 2; - tem = malloc(offsetof(BLOCK, s) + blockSize * sizeof(XML_Char)); + tem = pool->mem->malloc_fcn(offsetof(BLOCK, s) + blockSize * sizeof(XML_Char)); if (!tem) return 0; tem->size = blockSize; @@ -4376,7 +4449,7 @@ nextScaffoldPart(XML_Parser parser) int next; if (! dtd.scaffIndex) { - dtd.scaffIndex = malloc(groupSize * sizeof(int)); + dtd.scaffIndex = MALLOC(groupSize * sizeof(int)); if (! dtd.scaffIndex) return -1; dtd.scaffIndex[0] = 0; @@ -4385,12 +4458,12 @@ nextScaffoldPart(XML_Parser parser) if (dtd.scaffCount >= dtd.scaffSize) { if (dtd.scaffold) { dtd.scaffSize *= 2; - dtd.scaffold = (CONTENT_SCAFFOLD *) realloc(dtd.scaffold, + dtd.scaffold = (CONTENT_SCAFFOLD *) REALLOC(dtd.scaffold, dtd.scaffSize * sizeof(CONTENT_SCAFFOLD)); } else { dtd.scaffSize = 32; - dtd.scaffold = (CONTENT_SCAFFOLD *) malloc(dtd.scaffSize * sizeof(CONTENT_SCAFFOLD)); + dtd.scaffold = (CONTENT_SCAFFOLD *) MALLOC(dtd.scaffSize * sizeof(CONTENT_SCAFFOLD)); } if (! dtd.scaffold) return -1; @@ -4456,7 +4529,7 @@ build_model (XML_Parser parser) char * str; int allocsize = dtd.scaffCount * sizeof(XML_Content) + dtd.contentStringLen; - ret = malloc(allocsize); + ret = MALLOC(allocsize); if (! ret) return 0; |