summaryrefslogtreecommitdiff
path: root/bindings
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2011-12-21 22:18:10 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2011-12-21 22:18:10 +0000
commit83f3338663c4969eebefd8c2c43bd3fc43587fdd (patch)
treee48ba69628c5ba793533094e308c1fce9acb21aa /bindings
parent4ade8ad1c7b23e6eeeee6681acbdb43fb10cab43 (diff)
downloadlibdom-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.c65
-rw-r--r--bindings/hubbub/parser.h2
-rw-r--r--bindings/xml/xmlparser.c88
-rw-r--r--bindings/xml/xmlparser.h2
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);