summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/hubbub/parser.h6
-rw-r--r--src/parser.c62
-rw-r--r--test/parser.c4
-rw-r--r--test/tree-buf.c4
-rw-r--r--test/tree.c4
-rw-r--r--test/tree2.c4
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,