summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2008-11-09 17:47:08 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2008-11-09 17:47:08 +0000
commitfd23949103aa8ec2c98ad3b209738617825e381d (patch)
tree530d36baa207496540212001b46337aadfb4e32e /src
parent9c6e96d743c993f1b92f0cc2f07164d44780536e (diff)
downloadlibhubbub-fd23949103aa8ec2c98ad3b209738617825e381d.tar.gz
libhubbub-fd23949103aa8ec2c98ad3b209738617825e381d.tar.bz2
Return errors from treebuilder constructor/destructor
svn path=/trunk/hubbub/; revision=5665
Diffstat (limited to 'src')
-rw-r--r--src/parser.c6
-rw-r--r--src/treebuilder/treebuilder.c42
-rw-r--r--src/treebuilder/treebuilder.h6
3 files changed, 32 insertions, 22 deletions
diff --git a/src/parser.c b/src/parser.c
index b67e9d1..9ca7bdf 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -80,12 +80,12 @@ hubbub_parser *hubbub_parser_create(const char *enc, bool fix_enc,
return NULL; ///
}
- parser->tb = hubbub_treebuilder_create(parser->tok, alloc, pw);
- if (parser->tb == NULL) {
+ error = hubbub_treebuilder_create(parser->tok, alloc, pw, &parser->tb);
+ if (error != HUBBUB_OK) {
hubbub_tokeniser_destroy(parser->tok);
parserutils_inputstream_destroy(parser->stream);
alloc(parser, 0, pw);
- return NULL;
+ return NULL; ///
}
parser->alloc = alloc;
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 3ffe99f..59fc4e1 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -84,23 +84,27 @@ static const struct {
/**
* Create a hubbub treebuilder
*
- * \param tokeniser Underlying tokeniser instance
- * \param alloc Memory (de)allocation function
- * \param pw Pointer to client-specific private data
- * \return Pointer to treebuilder instance, or NULL on error.
+ * \param tokeniser Underlying tokeniser instance
+ * \param alloc Memory (de)allocation function
+ * \param pw Pointer to client-specific private data
+ * \param treebuilder Pointer to location to receive treebuilder instance
+ * \return HUBBUB_OK on success,
+ * HUBBUB_BADPARM on bad parameters
+ * HUBBUB_NOMEM on memory exhaustion
*/
-hubbub_treebuilder *hubbub_treebuilder_create(hubbub_tokeniser *tokeniser,
- hubbub_alloc alloc, void *pw)
+hubbub_error hubbub_treebuilder_create(hubbub_tokeniser *tokeniser,
+ hubbub_alloc alloc, void *pw, hubbub_treebuilder **treebuilder)
{
+ hubbub_error error;
hubbub_treebuilder *tb;
hubbub_tokeniser_optparams tokparams;
- if (tokeniser == NULL || alloc == NULL)
- return NULL;
+ if (tokeniser == NULL || alloc == NULL || treebuilder == NULL)
+ return HUBBUB_BADPARM;
tb = alloc(NULL, sizeof(hubbub_treebuilder), pw);
if (tb == NULL)
- return NULL;
+ return HUBBUB_NOMEM;
tb->tokeniser = tokeniser;
@@ -114,7 +118,7 @@ hubbub_treebuilder *hubbub_treebuilder_create(hubbub_tokeniser *tokeniser,
pw);
if (tb->context.element_stack == NULL) {
alloc(tb, 0, pw);
- return NULL;
+ return HUBBUB_NOMEM;
}
tb->context.stack_alloc = ELEMENT_STACK_CHUNK;
/* We rely on HTML not being equal to zero to determine
@@ -133,28 +137,32 @@ hubbub_treebuilder *hubbub_treebuilder_create(hubbub_tokeniser *tokeniser,
tokparams.token_handler.handler = hubbub_treebuilder_token_handler;
tokparams.token_handler.pw = tb;
- if (hubbub_tokeniser_setopt(tokeniser, HUBBUB_TOKENISER_TOKEN_HANDLER,
- &tokparams) != HUBBUB_OK) {
+ error = hubbub_tokeniser_setopt(tokeniser,
+ HUBBUB_TOKENISER_TOKEN_HANDLER, &tokparams);
+ if (error != HUBBUB_OK) {
alloc(tb->context.element_stack, 0, pw);
alloc(tb, 0, pw);
- return NULL;
+ return error;
}
- return tb;
+ *treebuilder = tb;
+
+ return HUBBUB_OK;
}
/**
* Destroy a hubbub treebuilder
*
* \param treebuilder The treebuilder instance to destroy
+ * \return HUBBUB_OK on success, appropriate error otherwise
*/
-void hubbub_treebuilder_destroy(hubbub_treebuilder *treebuilder)
+hubbub_error hubbub_treebuilder_destroy(hubbub_treebuilder *treebuilder)
{
formatting_list_entry *entry, *next;
hubbub_tokeniser_optparams tokparams;
if (treebuilder == NULL)
- return;
+ return HUBBUB_BADPARM;
tokparams.token_handler.handler = NULL;
tokparams.token_handler.pw = NULL;
@@ -218,6 +226,8 @@ void hubbub_treebuilder_destroy(hubbub_treebuilder *treebuilder)
}
treebuilder->alloc(treebuilder, 0, treebuilder->alloc_pw);
+
+ return HUBBUB_OK;
}
/**
diff --git a/src/treebuilder/treebuilder.h b/src/treebuilder/treebuilder.h
index c7587a8..0f883ec 100644
--- a/src/treebuilder/treebuilder.h
+++ b/src/treebuilder/treebuilder.h
@@ -47,11 +47,11 @@ typedef union hubbub_treebuilder_optparams {
} hubbub_treebuilder_optparams;
/* Create a hubbub treebuilder */
-hubbub_treebuilder *hubbub_treebuilder_create(hubbub_tokeniser *tokeniser,
- hubbub_alloc alloc, void *pw);
+hubbub_error hubbub_treebuilder_create(hubbub_tokeniser *tokeniser,
+ hubbub_alloc alloc, void *pw, hubbub_treebuilder **treebuilder);
/* Destroy a hubbub treebuilder */
-void hubbub_treebuilder_destroy(hubbub_treebuilder *treebuilder);
+hubbub_error hubbub_treebuilder_destroy(hubbub_treebuilder *treebuilder);
/* Configure a hubbub treebuilder */
hubbub_error hubbub_treebuilder_setopt(hubbub_treebuilder *treebuilder,