summaryrefslogtreecommitdiff
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
parentedac2587515fdb202663fc9ffc6b527d7a6da907 (diff)
downloadphp-git-21661d3bde0023f36e5af15ff5926a30e367e948.tar.gz
Added even better allocator codes for both expat & libxml
-rw-r--r--ext/xml/compat.c54
-rw-r--r--ext/xml/expat_compat.h8
-rw-r--r--ext/xml/xml.c32
3 files changed, 75 insertions, 19 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 */
diff --git a/ext/xml/expat_compat.h b/ext/xml/expat_compat.h
index 1ece0bd608..9b38caa1dc 100644
--- a/ext/xml/expat_compat.h
+++ b/ext/xml/expat_compat.h
@@ -43,6 +43,12 @@ typedef int (*XML_ExternalEntityRefHandler)(void *, const XML_Char *, const XML
typedef void (*XML_StartNamespaceDeclHandler)(void *, const XML_Char *, const XML_Char *);
typedef void (*XML_EndNamespaceDeclHandler)(void *, const XML_Char *);
+typedef struct _XML_Memory_Handling_Suite {
+ void *(*malloc_fcn)(size_t size);
+ void *(*realloc_fcn)(void *ptr, size_t size);
+ void (*free_fcn)(void *ptr);
+} XML_Memory_Handling_Suite;
+
typedef struct _XML_Parser {
int namespace;
@@ -62,10 +68,12 @@ typedef struct _XML_Parser {
XML_ExternalEntityRefHandler h_external_entity_ref;
XML_StartNamespaceDeclHandler h_start_ns;
XML_EndNamespaceDeclHandler h_end_ns;
+ XML_Memory_Handling_Suite mem_hdlrs;
} *XML_Parser;
XML_Parser XML_ParserCreate(const XML_Char *);
XML_Parser XML_ParserCreateNS(const XML_Char *, const XML_Char);
+XML_ParserCreate_MM(const XML_Char *, const XML_Memory_Handling_Suite *, const XML_Char *);
void XML_SetUserData(XML_Parser, void *);
void *XML_GetUserData(XML_Parser);
void XML_SetElementHandler(XML_Parser, XML_StartElementHandler, XML_EndElementHandler);
diff --git a/ext/xml/xml.c b/ext/xml/xml.c
index 04b654fae3..6b4a57a27f 100644
--- a/ext/xml/xml.c
+++ b/ext/xml/xml.c
@@ -152,6 +152,8 @@ xml_encoding xml_encodings[] = {
{ NULL, NULL, NULL }
};
+static XML_Memory_Handling_Suite php_xml_mem_hdlrs;
+
/* True globals, no need for thread safety */
static int le_xml_parser;
@@ -165,6 +167,21 @@ static void php_xml_init_globals(php_xml_globals *xml_globals_p TSRMLS_DC)
}
#endif
+static void *php_xml_malloc_wrapper(size_t sz)
+{
+ return emalloc(sz);
+}
+
+static void *php_xml_realloc_wrapper(void *ptr, size_t sz)
+{
+ return erealloc(ptr, sz);
+}
+
+static void php_xml_free_wrapper(void *ptr)
+{
+ efree(ptr);
+}
+
PHP_MINIT_FUNCTION(xml)
{
le_xml_parser = zend_register_list_destructors_ex(xml_parser_dtor, NULL, "xml", module_number);
@@ -203,10 +220,13 @@ PHP_MINIT_FUNCTION(xml)
REGISTER_LONG_CONSTANT("XML_OPTION_SKIP_TAGSTART", PHP_XML_OPTION_SKIP_TAGSTART, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("XML_OPTION_SKIP_WHITE", PHP_XML_OPTION_SKIP_WHITE, CONST_CS|CONST_PERSISTENT);
-#ifdef LIBXML_EXPAT_COMPAT
- xmlMemSetup(_efree, _emalloc, _erealloc, _estrdup);
-#endif
-
+ /* this object should not be pre-initialised at compile time,
+ as the order of members may vary */
+
+ php_xml_mem_hdlrs.malloc_fcn = php_xml_malloc_wrapper;
+ php_xml_mem_hdlrs.realloc_fcn = php_xml_realloc_wrapper;
+ php_xml_mem_hdlrs.free_fcn = php_xml_free_wrapper;
+
return SUCCESS;
}
@@ -1032,7 +1052,7 @@ PHP_FUNCTION(xml_parser_create)
}
parser = ecalloc(sizeof(xml_parser), 1);
- parser->parser = XML_ParserCreate(encoding);
+ parser->parser = XML_ParserCreate_MM(encoding, &php_xml_mem_hdlrs, NULL);
parser->target_encoding = encoding;
parser->case_folding = 1;
parser->object = NULL;
@@ -1088,7 +1108,7 @@ PHP_FUNCTION(xml_parser_create_ns)
}
parser = ecalloc(sizeof(xml_parser), 1);
- parser->parser = XML_ParserCreateNS(encoding, sep[0]);
+ parser->parser = XML_ParserCreate_MM(encoding, &php_xml_mem_hdlrs, sep);
parser->target_encoding = encoding;
parser->case_folding = 1;
parser->object = NULL;