diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2011-12-21 22:18:10 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2011-12-21 22:18:10 +0000 |
commit | 83f3338663c4969eebefd8c2c43bd3fc43587fdd (patch) | |
tree | e48ba69628c5ba793533094e308c1fce9acb21aa /bindings | |
parent | 4ade8ad1c7b23e6eeeee6681acbdb43fb10cab43 (diff) | |
download | libdom-83f3338663c4969eebefd8c2c43bd3fc43587fdd.tar.gz libdom-83f3338663c4969eebefd8c2c43bd3fc43587fdd.tar.bz2 |
Merge branches/jmb/dom-alloc-purge back to trunk
svn path=/trunk/libdom/; revision=13316
Diffstat (limited to 'bindings')
-rw-r--r-- | bindings/hubbub/parser.c | 65 | ||||
-rw-r--r-- | bindings/hubbub/parser.h | 2 | ||||
-rw-r--r-- | bindings/xml/xmlparser.c | 88 | ||||
-rw-r--r-- | bindings/xml/xmlparser.h | 2 |
4 files changed, 85 insertions, 72 deletions
diff --git a/bindings/hubbub/parser.c b/bindings/hubbub/parser.c index ad234e8..7e64cba 100644 --- a/bindings/hubbub/parser.c +++ b/bindings/hubbub/parser.c @@ -38,9 +38,6 @@ struct dom_hubbub_parser { bool complete; /**< Indicate stream completion */ - dom_alloc alloc; /**< Memory (de)allocation function */ - void *pw; /**< Pointer to client data */ - dom_msg msg; /**< Informational messaging function */ void *mctx; /**< Pointer to client data */ }; @@ -97,27 +94,40 @@ static hubbub_tree_handler tree_handler = { NULL }; +static void *dom_hubbub_alloc(void *ptr, size_t len, void *pw) +{ + UNUSED(pw); + + if (ptr == NULL) + return len > 0 ? malloc(len) : NULL; + + if (len == 0) { + free(ptr); + return NULL; + } + + return realloc(ptr, len); +} + /** * Create a Hubbub parser instance * * \param enc Source charset, or NULL * \param fix_enc Whether fix the encoding - * \param alloc Memory (de)allocation function - * \param pw Pointer to client-specific private data * \param msg Informational message function * \param mctx Pointer to client-specific private data * \return Pointer to instance, or NULL on memory exhaustion */ dom_hubbub_parser *dom_hubbub_parser_create( const char *enc, bool fix_enc, - dom_alloc alloc, void *pw, dom_msg msg, void *mctx) + dom_msg msg, void *mctx) { dom_hubbub_parser *parser; hubbub_parser_optparams params; hubbub_error error; dom_exception err; - parser = alloc(NULL, sizeof(dom_hubbub_parser), pw); + parser = dom_hubbub_alloc(NULL, sizeof(dom_hubbub_parser), NULL); if (parser == NULL) { msg(DOM_MSG_CRITICAL, mctx, "No memory for parsing context"); return NULL; @@ -130,14 +140,13 @@ dom_hubbub_parser *dom_hubbub_parser_create( : ENCODING_SOURCE_DETECTED; parser->complete = false; - parser->alloc = alloc; - parser->pw = pw; parser->msg = msg; parser->mctx = mctx; - error = hubbub_parser_create(enc, fix_enc, alloc, pw, &parser->parser); + error = hubbub_parser_create(enc, fix_enc, dom_hubbub_alloc, NULL, + &parser->parser); if (error != HUBBUB_OK) { - parser->alloc(parser, 0, parser->pw); + dom_hubbub_alloc(parser, 0, NULL); msg(DOM_MSG_CRITICAL, mctx, "Can't create parser"); return NULL; } @@ -147,10 +156,10 @@ dom_hubbub_parser *dom_hubbub_parser_create( * Netsurf */ err = dom_implementation_create_document(DOM_IMPLEMENTATION_HTML, NULL, NULL, NULL, - alloc, pw, NULL, &parser->doc); + NULL, &parser->doc); if (err != DOM_NO_ERR) { hubbub_parser_destroy(parser->parser); - alloc(parser, 0, pw); + dom_hubbub_alloc(parser, 0, NULL); msg(DOM_MSG_ERROR, mctx, "Can't create DOM document"); return NULL; } @@ -185,7 +194,7 @@ void dom_hubbub_parser_destroy(dom_hubbub_parser *parser) parser->doc = NULL; } - parser->alloc(parser, 0, parser->pw); + dom_hubbub_alloc(parser, 0, NULL); } /** @@ -219,9 +228,9 @@ dom_hubbub_error dom_hubbub_parser_parse_chunk(dom_hubbub_parser *parser, */ dom_hubbub_error dom_hubbub_parser_completed(dom_hubbub_parser *parser) { + dom_exception derr; hubbub_error err; - lwc_string *name = NULL; - lwc_error lerr; + dom_string *name = NULL; err = hubbub_parser_completed(parser->parser); if (err != HUBBUB_OK) { @@ -232,12 +241,12 @@ dom_hubbub_error dom_hubbub_parser_completed(dom_hubbub_parser *parser) parser->complete = true; - lerr = lwc_intern_string("id", strlen("id"), &name); - if (lerr != lwc_error_ok) + derr = dom_string_create((const uint8_t *) "id", SLEN("id"), &name); + if (derr != DOM_NO_ERR) return HUBBUB_UNKNOWN; _dom_document_set_id_name(parser->doc, name); - lwc_string_unref(name); + dom_string_unref(name); return DOM_HUBBUB_OK; } @@ -288,8 +297,7 @@ static hubbub_error create_comment(void *parser, const hubbub_string *data, *result = NULL; - err = dom_string_create(dom_parser->alloc, dom_parser->pw, data->ptr, - data->len, &str); + err = dom_string_create(data->ptr, data->len, &str); if (err != DOM_NO_ERR) { dom_parser->msg(DOM_MSG_CRITICAL, dom_parser->mctx, "Can't create comment node text"); @@ -355,8 +363,7 @@ static hubbub_error create_doctype(void *parser, const hubbub_doctype *doctype, } err = dom_implementation_create_document_type(qname, - public_id, system_id, dom_parser->alloc, - dom_parser->pw, &dtype); + public_id, system_id, &dtype); if (err != DOM_NO_ERR) { dom_parser->msg(DOM_MSG_CRITICAL, dom_parser->mctx, "Can't create the document type"); @@ -392,8 +399,7 @@ static hubbub_error create_element(void *parser, const hubbub_tag *tag, *result = NULL; - err = dom_string_create(dom_parser->alloc, dom_parser->pw, - tag->name.ptr, tag->name.len, &name); + err = dom_string_create(tag->name.ptr, tag->name.len, &name); if (err != DOM_NO_ERR) { dom_parser->msg(DOM_MSG_CRITICAL, dom_parser->mctx, "Can't create element name"); @@ -448,8 +454,7 @@ static hubbub_error create_text(void *parser, const hubbub_string *data, *result = NULL; - err = dom_string_create(dom_parser->alloc, dom_parser->pw, data->ptr, - data->len, &str); + err = dom_string_create(data->ptr, data->len, &str); if (err != DOM_NO_ERR) { dom_parser->msg(DOM_MSG_CRITICAL, dom_parser->mctx, "Can't create text '%.*s'", data->len, @@ -691,8 +696,7 @@ static hubbub_error add_attributes(void *parser, void *node, for (i = 0; i < n_attributes; i++) { dom_string *name, *value; - err = dom_string_create(dom_parser->alloc, dom_parser->pw, - attributes[i].name.ptr, + err = dom_string_create(attributes[i].name.ptr, attributes[i].name.len, &name); if (err != DOM_NO_ERR) { dom_parser->msg(DOM_MSG_CRITICAL, dom_parser->mctx, @@ -700,8 +704,7 @@ static hubbub_error add_attributes(void *parser, void *node, goto fail; } - err = dom_string_create(dom_parser->alloc, dom_parser->pw, - attributes[i].value.ptr, + err = dom_string_create(attributes[i].value.ptr, attributes[i].value.len, &value); if (err != DOM_NO_ERR) { dom_parser->msg(DOM_MSG_CRITICAL, dom_parser->mctx, diff --git a/bindings/hubbub/parser.h b/bindings/hubbub/parser.h index 0d9f953..2707ff4 100644 --- a/bindings/hubbub/parser.h +++ b/bindings/hubbub/parser.h @@ -50,7 +50,7 @@ typedef enum dom_hubub_encoding_source { /* Create a Hubbub parser instance */ dom_hubbub_parser *dom_hubbub_parser_create( const char *enc, bool fix_enc, - dom_alloc alloc, void *pw, dom_msg msg, void *mctx); + dom_msg msg, void *mctx); /* Destroy a Hubbub parser instance */ void dom_hubbub_parser_destroy(dom_hubbub_parser *parser); diff --git a/bindings/xml/xmlparser.c b/bindings/xml/xmlparser.c index fbb2c2f..3ae1a3c 100644 --- a/bindings/xml/xmlparser.c +++ b/bindings/xml/xmlparser.c @@ -96,9 +96,6 @@ struct dom_xml_parser { dom_string *udkey; /**< Key for DOM node user data */ - dom_alloc alloc; /**< Memory (de)allocation function */ - void *pw; /**< Pointer to client data */ - dom_msg msg; /**< Informational message function */ void *mctx; /**< Pointer to client data */ }; @@ -141,13 +138,26 @@ static xmlSAXHandler sax_handler = { .serror = NULL }; +static void *dom_xml_alloc(void *ptr, size_t len, void *pw) +{ + UNUSED(pw); + + if (ptr == NULL) + return len > 0 ? malloc(len) : NULL; + + if (len == 0) { + free(ptr); + return NULL; + } + + return realloc(ptr, len); +} + /** * Create an XML parser instance * * \param enc Source charset, or NULL * \param int_enc Desired charset of document buffer (UTF-8 or UTF-16) - * \param alloc Memory (de)allocation function - * \param pw Pointer to client-specific private data * \param msg Informational message function * \param mctx Pointer to client-specific private data * \return Pointer to instance, or NULL on memory exhaustion @@ -157,7 +167,7 @@ static xmlSAXHandler sax_handler = { * parser encoding is not yet implemented */ dom_xml_parser *dom_xml_parser_create(const char *enc, const char *int_enc, - dom_alloc alloc, void *pw, dom_msg msg, void *mctx) + dom_msg msg, void *mctx) { dom_xml_parser *parser; dom_exception err; @@ -166,7 +176,7 @@ dom_xml_parser *dom_xml_parser_create(const char *enc, const char *int_enc, UNUSED(enc); UNUSED(int_enc); - parser = alloc(NULL, sizeof(dom_xml_parser), pw); + parser = dom_xml_alloc(NULL, sizeof(dom_xml_parser), NULL); if (parser == NULL) { msg(DOM_MSG_CRITICAL, mctx, "No memory for parser"); return NULL; @@ -175,7 +185,7 @@ dom_xml_parser *dom_xml_parser_create(const char *enc, const char *int_enc, parser->xml_ctx = xmlCreatePushParserCtxt(&sax_handler, parser, "", 0, NULL); if (parser->xml_ctx == NULL) { - alloc(parser, 0, pw); + dom_xml_alloc(parser, 0, NULL); msg(DOM_MSG_CRITICAL, mctx, "Failed to create XML parser"); return NULL; } @@ -183,26 +193,27 @@ dom_xml_parser *dom_xml_parser_create(const char *enc, const char *int_enc, /* Set options of parsing context */ ret = xmlCtxtUseOptions(parser->xml_ctx, XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD); - assert(ret == 0); + if (ret != 0) { + xmlFreeParserCtxt(parser->xml_ctx); + dom_xml_alloc(parser, 0, NULL); + msg(DOM_MSG_CRITICAL, mctx, "Failed setting parser options"); + return NULL; + } parser->doc = NULL; parser->complete = false; /* Create key for user data registration */ - err = dom_string_create((dom_alloc) alloc, pw, - (const uint8_t *) "__xmlnode", SLEN("__xmlnode"), - &parser->udkey); + err = dom_string_create((const uint8_t *) "__xmlnode", + SLEN("__xmlnode"), &parser->udkey); if (err != DOM_NO_ERR) { xmlFreeParserCtxt(parser->xml_ctx); - alloc(parser, 0, pw); + dom_xml_alloc(parser, 0, NULL); msg(DOM_MSG_CRITICAL, mctx, "No memory for userdata key"); return NULL; } - parser->alloc = alloc; - parser->pw = pw; - parser->msg = msg; parser->mctx = mctx; @@ -218,11 +229,11 @@ void dom_xml_parser_destroy(dom_xml_parser *parser) { dom_string_unref(parser->udkey); - xmlFreeParserCtxt(parser->xml_ctx); - xmlFreeDoc(parser->xml_ctx->myDoc); + + xmlFreeParserCtxt(parser->xml_ctx); - parser->alloc(parser, 0, parser->pw); + dom_xml_alloc(parser, 0, NULL); } /** @@ -259,8 +270,8 @@ dom_xml_error dom_xml_parser_parse_chunk(dom_xml_parser *parser, dom_xml_error dom_xml_parser_completed(dom_xml_parser *parser) { xmlParserErrors err; - lwc_string *name = NULL; - lwc_error lerr; + dom_string *name = NULL; + dom_exception derr; err = xmlParseChunk(parser->xml_ctx, "", 0, 1); if (err != XML_ERR_OK) { @@ -274,12 +285,12 @@ dom_xml_error dom_xml_parser_completed(dom_xml_parser *parser) /* TODO: In future, this string "id" should be extracted from the * document schema file instead of just setting it as "id". */ - lerr = lwc_intern_string("id", SLEN("id"), &name); - if (lerr != lwc_error_ok) - return _dom_exception_from_lwc_error(lerr); + derr = dom_string_create((const uint8_t *) "id", SLEN("id"), &name); + if (derr != DOM_NO_ERR) + return derr; _dom_document_set_id_name(parser->doc, name); - lwc_string_unref(name); + dom_string_unref(name); return DOM_XML_OK; } @@ -319,7 +330,7 @@ void xml_parser_start_document(void *ctx) /* namespace */ NULL, /* qname */ NULL, /* doctype */ NULL, - parser->alloc, parser->pw, NULL, + NULL, &doc); if (err != DOM_NO_ERR) { parser->msg(DOM_MSG_CRITICAL, parser->mctx, @@ -642,9 +653,8 @@ void xml_parser_add_element_node(dom_xml_parser *parser, dom_string *tag_name; /* Create tag name DOM string */ - err = _dom_document_create_string(parser->doc, - child->name, strlen((const char *) child->name), - &tag_name); + err = dom_string_create(child->name, + strlen((const char *) child->name), &tag_name); if (err != DOM_NO_ERR) { parser->msg(DOM_MSG_CRITICAL, parser->mctx, "No memory for tag name"); @@ -675,7 +685,7 @@ void xml_parser_add_element_node(dom_xml_parser *parser, uint8_t qnamebuf[qnamelen + 1 /* '\0' */]; /* Create namespace DOM string */ - err = _dom_document_create_string(parser->doc, + err = dom_string_create( child->ns->href, strlen((const char *) child->ns->href), &namespace); @@ -694,7 +704,7 @@ void xml_parser_add_element_node(dom_xml_parser *parser, (const char *) child->name); /* Create qname DOM string */ - err = _dom_document_create_string(parser->doc, + err = dom_string_create( qnamebuf, qnamelen, &qname); @@ -733,7 +743,7 @@ void xml_parser_add_element_node(dom_xml_parser *parser, dom_string *name; /* Create attribute name DOM string */ - err = _dom_document_create_string(parser->doc, + err = dom_string_create( a->name, strlen((const char *) a->name), &name); @@ -767,7 +777,7 @@ void xml_parser_add_element_node(dom_xml_parser *parser, uint8_t qnamebuf[qnamelen + 1 /* '\0' */]; /* Create namespace DOM string */ - err = _dom_document_create_string(parser->doc, + err = dom_string_create( a->ns->href, strlen((const char *) a->ns->href), &namespace); @@ -786,7 +796,7 @@ void xml_parser_add_element_node(dom_xml_parser *parser, (const char *) a->name); /* Create qname DOM string */ - err = _dom_document_create_string(parser->doc, + err = dom_string_create( qnamebuf, qnamelen, &qname); @@ -908,7 +918,7 @@ void xml_parser_add_text_node(dom_xml_parser *parser, struct dom_node *parent, dom_exception err; /* Create DOM string data for text node */ - err = _dom_document_create_string(parser->doc, child->content, + err = dom_string_create(child->content, strlen((const char *) child->content), &data); if (err != DOM_NO_ERR) { parser->msg(DOM_MSG_CRITICAL, parser->mctx, @@ -969,7 +979,7 @@ void xml_parser_add_cdata_section(dom_xml_parser *parser, dom_exception err; /* Create DOM string data for cdata section */ - err = _dom_document_create_string(parser->doc, child->content, + err = dom_string_create(child->content, strlen((const char *) child->content), &data); if (err != DOM_NO_ERR) { parser->msg(DOM_MSG_CRITICAL, parser->mctx, @@ -1031,7 +1041,7 @@ void xml_parser_add_entity_reference(dom_xml_parser *parser, dom_exception err; /* Create name of entity reference */ - err = _dom_document_create_string(parser->doc, child->name, + err = dom_string_create(child->name, strlen((const char *) child->name), &name); if (err != DOM_NO_ERR) { parser->msg(DOM_MSG_CRITICAL, parser->mctx, @@ -1106,7 +1116,7 @@ void xml_parser_add_comment(dom_xml_parser *parser, struct dom_node *parent, dom_exception err; /* Create DOM string data for comment */ - err = _dom_document_create_string(parser->doc, child->content, + err = dom_string_create(child->content, strlen((const char *) child->content), &data); if (err != DOM_NO_ERR) { parser->msg(DOM_MSG_CRITICAL, parser->mctx, @@ -1181,7 +1191,7 @@ void xml_parser_add_document_type(dom_xml_parser *parser, /* Create doctype */ err = dom_implementation_create_document_type( qname, public_id, system_id, - parser->alloc, parser->pw, &doctype); + &doctype); if (err != DOM_NO_ERR) { parser->msg(DOM_MSG_CRITICAL, parser->mctx, "Failed to create document type"); diff --git a/bindings/xml/xmlparser.h b/bindings/xml/xmlparser.h index 7bf3807..31771b5 100644 --- a/bindings/xml/xmlparser.h +++ b/bindings/xml/xmlparser.h @@ -21,7 +21,7 @@ typedef struct dom_xml_parser dom_xml_parser; /* Create an XML parser instance */ dom_xml_parser *dom_xml_parser_create(const char *enc, const char *int_enc, - dom_alloc alloc, void *pw, dom_msg msg, void *mctx); + dom_msg msg, void *mctx); /* Destroy an XML parser instance */ void dom_xml_parser_destroy(dom_xml_parser *parser); |