From fd23949103aa8ec2c98ad3b209738617825e381d Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 9 Nov 2008 17:47:08 +0000 Subject: Return errors from treebuilder constructor/destructor svn path=/trunk/hubbub/; revision=5665 --- src/parser.c | 6 +++--- src/treebuilder/treebuilder.c | 42 ++++++++++++++++++++++++++---------------- src/treebuilder/treebuilder.h | 6 +++--- 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, -- cgit v1.2.3