summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.hin3
-rw-r--r--configure.in8
-rw-r--r--doc/reference.html34
-rw-r--r--lib/Makefile.in18
-rw-r--r--lib/expat.h163
-rw-r--r--lib/xmlparse.c321
6 files changed, 316 insertions, 231 deletions
diff --git a/config.hin b/config.hin
index f443124..c3942a5 100644
--- a/config.hin
+++ b/config.hin
@@ -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;