]> granicus.if.org Git - php/commitdiff
Added even better allocator codes for both expat & libxml
authorMoriyoshi Koizumi <moriyoshi@php.net>
Wed, 7 May 2003 15:21:31 +0000 (15:21 +0000)
committerMoriyoshi Koizumi <moriyoshi@php.net>
Wed, 7 May 2003 15:21:31 +0000 (15:21 +0000)
ext/xml/compat.c
ext/xml/expat_compat.h
ext/xml/xml.c

index 8176631fa09452f8e135f1cc3587993cbebb7fa8..d910ffe0600561b3acfac2b8ab77e1b12df9ffe9 100644 (file)
@@ -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 */
index 1ece0bd60816097501380d2b00657bac548cc7a4..9b38caa1dca364747e41497252e1c65605c698b3 100644 (file)
@@ -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);
index 04b654fae322c379016c0477ffc27c051086c558..6b4a57a27f9015c36ec8075d8ea2613745f85c94 100644 (file)
@@ -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;