From fe1b45b77687b0f9ab81f851e9eb2846f34e6765 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 9 Nov 2008 17:54:43 +0000 Subject: Return errors from parser constructor/destructor. This changes the public API. svn path=/trunk/hubbub/; revision=5666 --- include/hubbub/parser.h | 6 ++--- src/parser.c | 62 ++++++++++++++++++++++++++++--------------------- test/parser.c | 4 ++-- test/tree-buf.c | 4 ++-- test/tree.c | 4 ++-- test/tree2.c | 4 ++-- 6 files changed, 46 insertions(+), 38 deletions(-) diff --git a/include/hubbub/parser.h b/include/hubbub/parser.h index 2e34b5e..d08d70e 100644 --- a/include/hubbub/parser.h +++ b/include/hubbub/parser.h @@ -56,10 +56,10 @@ typedef union hubbub_parser_optparams { } hubbub_parser_optparams; /* Create a hubbub parser */ -hubbub_parser *hubbub_parser_create(const char *enc, bool fix_enc, - hubbub_alloc alloc, void *pw); +hubbub_error hubbub_parser_create(const char *enc, bool fix_enc, + hubbub_alloc alloc, void *pw, hubbub_parser **parser); /* Destroy a hubbub parser */ -void hubbub_parser_destroy(hubbub_parser *parser); +hubbub_error hubbub_parser_destroy(hubbub_parser *parser); /* Configure a hubbub parser */ hubbub_error hubbub_parser_setopt(hubbub_parser *parser, diff --git a/src/parser.c b/src/parser.c index 9ca7bdf..93cc9cd 100644 --- a/src/parser.c +++ b/src/parser.c @@ -15,6 +15,7 @@ #include "charset/detect.h" #include "tokeniser/tokeniser.h" #include "treebuilder/treebuilder.h" +#include "utils/parserutilserror.h" /** * Hubbub parser object @@ -35,21 +36,24 @@ struct hubbub_parser { * `param fix_enc Permit fixing up of encoding if it's frequently misused * \param alloc Memory (de)allocation function * \param pw Pointer to client-specific private data (may be NULL) - * \return Pointer to parser instance, or NULL on error + * \param parser Pointer to location to receive parser instance + * \return HUBBUB_OK on success, + * HUBBUB_BADPARM on bad parameters, + * HUBBUB_NOMEM on memory exhaustion */ -hubbub_parser *hubbub_parser_create(const char *enc, bool fix_enc, - hubbub_alloc alloc, void *pw) +hubbub_error hubbub_parser_create(const char *enc, bool fix_enc, + hubbub_alloc alloc, void *pw, hubbub_parser **parser) { parserutils_error perror; hubbub_error error; - hubbub_parser *parser; + hubbub_parser *p; - if (alloc == NULL) - return NULL; + if (alloc == NULL || parser == NULL) + return HUBBUB_BADPARM; - parser = alloc(NULL, sizeof(hubbub_parser), pw); - if (parser == NULL) - return NULL; + p = alloc(NULL, sizeof(hubbub_parser), pw); + if (p == NULL) + return HUBBUB_NOMEM; /* If we have an encoding and we're permitted to fix up likely broken * ones, then attempt to do so. */ @@ -66,43 +70,45 @@ hubbub_parser *hubbub_parser_create(const char *enc, bool fix_enc, perror = parserutils_inputstream_create(enc, enc != NULL ? HUBBUB_CHARSET_CONFIDENT : HUBBUB_CHARSET_UNKNOWN, - hubbub_charset_extract, alloc, pw, &parser->stream); + hubbub_charset_extract, alloc, pw, &p->stream); if (perror != PARSERUTILS_OK) { - alloc(parser, 0, pw); - return NULL; + alloc(p, 0, pw); + return hubbub_error_from_parserutils_error(perror); } - error = hubbub_tokeniser_create(parser->stream, alloc, pw, - &parser->tok); + error = hubbub_tokeniser_create(p->stream, alloc, pw, &p->tok); if (error != HUBBUB_OK) { - parserutils_inputstream_destroy(parser->stream); - alloc(parser, 0, pw); - return NULL; /// + parserutils_inputstream_destroy(p->stream); + alloc(p, 0, pw); + return error; } - error = hubbub_treebuilder_create(parser->tok, alloc, pw, &parser->tb); + error = hubbub_treebuilder_create(p->tok, alloc, pw, &p->tb); if (error != HUBBUB_OK) { - hubbub_tokeniser_destroy(parser->tok); - parserutils_inputstream_destroy(parser->stream); - alloc(parser, 0, pw); - return NULL; /// + hubbub_tokeniser_destroy(p->tok); + parserutils_inputstream_destroy(p->stream); + alloc(p, 0, pw); + return error; } - parser->alloc = alloc; - parser->pw = pw; + p->alloc = alloc; + p->pw = pw; - return parser; + *parser = p; + + return HUBBUB_OK; } /** * Destroy a hubbub parser * * \param parser Parser instance to destroy + * \return HUBBUB_OK on success, appropriate error otherwise */ -void hubbub_parser_destroy(hubbub_parser *parser) +hubbub_error hubbub_parser_destroy(hubbub_parser *parser) { if (parser == NULL) - return; + return HUBBUB_BADPARM; hubbub_treebuilder_destroy(parser->tb); @@ -111,6 +117,8 @@ void hubbub_parser_destroy(hubbub_parser *parser) parserutils_inputstream_destroy(parser->stream); parser->alloc(parser, 0, parser->pw); + + return HUBBUB_OK; } /** diff --git a/test/parser.c b/test/parser.c index 6585bc7..5531af1 100644 --- a/test/parser.c +++ b/test/parser.c @@ -32,8 +32,8 @@ static int run_test(int argc, char **argv, unsigned int CHUNK_SIZE) /* Initialise library */ assert(hubbub_initialise(argv[1], myrealloc, NULL) == HUBBUB_OK); - parser = hubbub_parser_create("UTF-8", false, myrealloc, NULL); - assert(parser != NULL); + assert(hubbub_parser_create("UTF-8", false, myrealloc, NULL, &parser) == + HUBBUB_OK); params.token_handler.handler = token_handler; params.token_handler.pw = NULL; diff --git a/test/tree-buf.c b/test/tree-buf.c index 362f80a..e406a45 100644 --- a/test/tree-buf.c +++ b/test/tree-buf.c @@ -145,8 +145,8 @@ static hubbub_parser *setup_parser(void) hubbub_parser *parser; hubbub_parser_optparams params; - parser = hubbub_parser_create("UTF-8", false, myrealloc, NULL); - assert(parser != NULL); + assert(hubbub_parser_create("UTF-8", false, myrealloc, NULL, &parser) == + HUBBUB_OK); params.tree_handler = &tree_handler; assert(hubbub_parser_setopt(parser, HUBBUB_PARSER_TREE_HANDLER, diff --git a/test/tree.c b/test/tree.c index 74da1b0..9a5bf8c 100644 --- a/test/tree.c +++ b/test/tree.c @@ -95,8 +95,8 @@ static int run_test(int argc, char **argv, unsigned int CHUNK_SIZE) } node_ref_alloc = NODE_REF_CHUNK; - parser = hubbub_parser_create("UTF-8", false, myrealloc, NULL); - assert(parser != NULL); + assert(hubbub_parser_create("UTF-8", false, myrealloc, NULL, &parser) == + HUBBUB_OK); params.tree_handler = &tree_handler; assert(hubbub_parser_setopt(parser, HUBBUB_PARSER_TREE_HANDLER, diff --git a/test/tree2.c b/test/tree2.c index 3a9b5ad..8fba853 100644 --- a/test/tree2.c +++ b/test/tree2.c @@ -145,8 +145,8 @@ static hubbub_parser *setup_parser(void) hubbub_parser *parser; hubbub_parser_optparams params; - parser = hubbub_parser_create("UTF-8", false, myrealloc, NULL); - assert(parser != NULL); + assert(hubbub_parser_create("UTF-8", false, myrealloc, NULL, &parser) == + HUBBUB_OK); params.tree_handler = &tree_handler; assert(hubbub_parser_setopt(parser, HUBBUB_PARSER_TREE_HANDLER, -- cgit v1.2.3