diff options
author | Moriyoshi Koizumi <moriyoshi@php.net> | 2003-05-07 15:21:31 +0000 |
---|---|---|
committer | Moriyoshi Koizumi <moriyoshi@php.net> | 2003-05-07 15:21:31 +0000 |
commit | 21661d3bde0023f36e5af15ff5926a30e367e948 (patch) | |
tree | a7150f5f35f373dee7ec639b2d8225a490d0732d /ext/xml/compat.c | |
parent | edac2587515fdb202663fc9ffc6b527d7a6da907 (diff) | |
download | php-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.c | 54 |
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 */ |