summaryrefslogtreecommitdiff
path: root/ext/xml/compat.c
diff options
context:
space:
mode:
authorMoriyoshi Koizumi <moriyoshi@php.net>2003-05-07 15:21:31 +0000
committerMoriyoshi Koizumi <moriyoshi@php.net>2003-05-07 15:21:31 +0000
commit21661d3bde0023f36e5af15ff5926a30e367e948 (patch)
treea7150f5f35f373dee7ec639b2d8225a490d0732d /ext/xml/compat.c
parentedac2587515fdb202663fc9ffc6b527d7a6da907 (diff)
downloadphp-git-21661d3bde0023f36e5af15ff5926a30e367e948.tar.gz
Added even better allocator codes for both expat & libxml
Diffstat (limited to 'ext/xml/compat.c')
-rw-r--r--ext/xml/compat.c54
1 files changed, 41 insertions, 13 deletions
diff --git a/ext/xml/compat.c b/ext/xml/compat.c
index 8176631fa0..d910ffe060 100644
--- a/ext/xml/compat.c
+++ b/ext/xml/compat.c
@@ -197,33 +197,61 @@ php_xml_compat_handlers = {
XML_Parser
XML_ParserCreate(const XML_Char *encoding)
{
- XML_Parser parser;
+ return XML_ParserCreate_MM(encoding, NULL, NULL);
+}
- parser = (XML_Parser) calloc(1, sizeof(struct _XML_Parser));
- parser->parser = xmlCreatePushParserCtxt((xmlSAXHandlerPtr) &php_xml_compat_handlers, (void *) parser, NULL, 0, NULL);
- if (parser->parser == NULL) {
+XML_Parser
+XML_ParserCreateNS(const XML_Char *encoding, const XML_Char sep)
+{
+ XML_Char tmp[2];
+ tmp[0] = sep;
+ tmp[1] = '\0';
+ return XML_ParserCreate_MM(encoding, NULL, tmp);
+}
+
+static void *(*_expat_cpt_malloc_fcn)(size_t sz);
+
+static char *_expat_cpt_intn_strdup(const chat *str)
+{
+ size_t len;
+ char *retval;
+
+ len = strlen(str);
+ if ((retval = _expat_cpt_malloc_fcn(len + 1)) == NULL) {
return NULL;
}
- parser->parser->encoding = xmlStrdup(encoding);
+ memcpy(retval, str, len + 1);
- return parser;
+ return retval;
}
XML_Parser
-XML_ParserCreateNS(const XML_Char *encoding, const XML_Char sep)
+XML_ParserCreate_MM(const XML_Char *encoding, const XML_Memory_Handling_Suite *memsuite, const XML_Char *sep)
{
XML_Parser parser;
+ static XML_Memory_Handling_Suite mtemp_i = { malloc, realloc, free };
+
+ if (memsuite == NULL) {
+ memsuite = &mtemp_i;
+ }
+
+ _expat_cpt_malloc_fcn = memsuite->malloc_fcn; /* FIXME: not reentrant ! */
+
+ xmlMemSetup(memsuite->free_fcn, memsuite->malloc_fcn, memsuite->realloc_fcn, _expat_compat_intn_strdup); /* WHOCANFIXME: not reentrant ! */
- parser = (XML_Parser) calloc(1, sizeof(struct _XML_Parser));
+ parser = (XML_Parser) memsuite->malloc_fcn(sizeof(struct _XML_Parser));
+ parser->mem_hdlrs = *memsuite;
parser->parser = xmlCreatePushParserCtxt((xmlSAXHandlerPtr) &php_xml_compat_handlers, (void *) parser, NULL, 0, NULL);
if (parser->parser == NULL) {
+ parser->mem_hdlrs.free_fcn(parser->parser);
return NULL;
}
parser->parser->encoding = xmlStrdup(encoding);
- parser->namespace = 1;
- parser->_ns_map = xmlHashCreate(10);
- parser->_reverse_ns_map = xmlHashCreate(10);
-
+ if (sep != NULL) {
+ parser->namespace = 1;
+ parser->_ns_map = xmlHashCreate(10);
+ parser->_reverse_ns_map = xmlHashCreate(10);
+ }
return parser;
}
@@ -353,7 +381,7 @@ XML_ParserFree(XML_Parser parser)
xmlHashFree(parser->_reverse_ns_map, _free_ns_name);
}
xmlFreeParserCtxt(parser->parser);
- free(parser);
+ parser->mem_hdlrs.free_fcn(parser);
}
#endif /* LIBXML_EXPAT_COMPAT */