summaryrefslogtreecommitdiff
path: root/src/parse/parse.c
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2008-11-09 20:09:50 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2008-11-09 20:09:50 +0000
commit83c070f67a2c26672f0ddad9b7e9104c16d7015f (patch)
tree8baa79156f9e837972f4103e7d955d670b29f397 /src/parse/parse.c
parent93db0a01a331b1820ba26e1ced4cb288ee8bb47d (diff)
downloadlibcss-83c070f67a2c26672f0ddad9b7e9104c16d7015f.tar.gz
libcss-83c070f67a2c26672f0ddad9b7e9104c16d7015f.tar.bz2
Port libcss to new lpu API.
Make lexer, core parser, and css21 parser constructors&destructors return errors svn path=/trunk/libcss/; revision=5674
Diffstat (limited to 'src/parse/parse.c')
-rw-r--r--src/parse/parse.c157
1 files changed, 85 insertions, 72 deletions
diff --git a/src/parse/parse.c b/src/parse/parse.c
index 4c3f3bc..3976c0c 100644
--- a/src/parse/parse.c
+++ b/src/parse/parse.c
@@ -178,110 +178,121 @@ static css_error (*parseFuncs[])(css_parser *parser) = {
* \param cs_source Source of charset information, or CSS_CHARSET_DEFAULT
* \param alloc Memory (de)allocation function
* \param pw Pointer to client-specific private data
- * \return Pointer to parser instance, or NULL on memory exhaustion
+ * \param parser Pointer to location to receive parser instance
+ * \return CSS_OK on success,
+ * CSS_BADPARM on bad parameters,
+ * CSS_NOMEM on memory exhaustion
*/
-css_parser *css_parser_create(const char *charset, css_charset_source cs_source,
- css_alloc alloc, void *pw)
+css_error css_parser_create(const char *charset, css_charset_source cs_source,
+ css_alloc alloc, void *pw, css_parser **parser)
{
- css_parser *parser;
+ css_parser *p;
parser_state initial = { sStart, 0 };
parserutils_error perror;
+ css_error error;
- if (alloc == NULL)
- return NULL;
+ if (alloc == NULL || parser == NULL)
+ return CSS_BADPARM;
- parser = alloc(NULL, sizeof(css_parser), pw);
- if (parser == NULL)
- return NULL;
+ p = alloc(NULL, sizeof(css_parser), pw);
+ if (p == NULL)
+ return CSS_NOMEM;
- parser->stream = parserutils_inputstream_create(charset, cs_source,
- css_charset_extract, (parserutils_alloc) alloc, pw);
- if (parser->stream == NULL) {
- alloc(parser, 0, pw);
- return NULL;
+ perror = parserutils_inputstream_create(charset, cs_source,
+ css_charset_extract, (parserutils_alloc) alloc, pw,
+ &p->stream);
+ if (perror != PARSERUTILS_OK) {
+ alloc(p, 0, pw);
+ return css_error_from_parserutils_error(perror);
}
- parser->lexer = css_lexer_create(parser->stream, alloc, pw);
- if (parser->lexer == NULL) {
- parserutils_inputstream_destroy(parser->stream);
- alloc(parser, 0, pw);
- return NULL;
+ error = css_lexer_create(p->stream, alloc, pw, &p->lexer);
+ if (error != CSS_OK) {
+ parserutils_inputstream_destroy(p->stream);
+ alloc(p, 0, pw);
+ return error;
}
- parser->states = parserutils_stack_create(sizeof(parser_state),
- STACK_CHUNK, (parserutils_alloc) alloc, pw);
- if (parser->states == NULL) {
- css_lexer_destroy(parser->lexer);
- parserutils_inputstream_destroy(parser->stream);
- alloc(parser, 0, pw);
- return NULL;
+ perror = parserutils_stack_create(sizeof(parser_state),
+ STACK_CHUNK, (parserutils_alloc) alloc, pw,
+ &p->states);
+ if (perror != PARSERUTILS_OK) {
+ css_lexer_destroy(p->lexer);
+ parserutils_inputstream_destroy(p->stream);
+ alloc(p, 0, pw);
+ return css_error_from_parserutils_error(perror);
}
- parser->dictionary = parserutils_dict_create(
- (parserutils_alloc) alloc, pw);
- if (parser->dictionary == NULL) {
- parserutils_stack_destroy(parser->states);
- css_lexer_destroy(parser->lexer);
- parserutils_inputstream_destroy(parser->stream);
- alloc(parser, 0, pw);
- return NULL;
+ perror = parserutils_dict_create((parserutils_alloc) alloc, pw,
+ &p->dictionary);
+ if (perror != PARSERUTILS_OK) {
+ parserutils_stack_destroy(p->states);
+ css_lexer_destroy(p->lexer);
+ parserutils_inputstream_destroy(p->stream);
+ alloc(p, 0, pw);
+ return css_error_from_parserutils_error(perror);
}
- parser->tokens = parserutils_vector_create(sizeof(css_token),
- STACK_CHUNK, (parserutils_alloc) alloc, pw);
- if (parser->tokens == NULL) {
- parserutils_dict_destroy(parser->dictionary);
- parserutils_stack_destroy(parser->states);
- css_lexer_destroy(parser->lexer);
- parserutils_inputstream_destroy(parser->stream);
- alloc(parser, 0, pw);
- return NULL;
+ perror = parserutils_vector_create(sizeof(css_token),
+ STACK_CHUNK, (parserutils_alloc) alloc, pw,
+ &p->tokens);
+ if (perror != PARSERUTILS_OK) {
+ parserutils_dict_destroy(p->dictionary);
+ parserutils_stack_destroy(p->states);
+ css_lexer_destroy(p->lexer);
+ parserutils_inputstream_destroy(p->stream);
+ alloc(p, 0, pw);
+ return css_error_from_parserutils_error(perror);
}
- parser->open_items = parserutils_stack_create(sizeof(char),
- STACK_CHUNK, (parserutils_alloc) alloc, pw);
- if (parser->open_items == NULL) {
- parserutils_vector_destroy(parser->tokens);
- parserutils_stack_destroy(parser->states);
- css_lexer_destroy(parser->lexer);
- parserutils_inputstream_destroy(parser->stream);
- alloc(parser, 0, pw);
- return NULL;
+ perror = parserutils_stack_create(sizeof(char),
+ STACK_CHUNK, (parserutils_alloc) alloc, pw,
+ &p->open_items);
+ if (perror != PARSERUTILS_OK) {
+ parserutils_vector_destroy(p->tokens);
+ parserutils_stack_destroy(p->states);
+ css_lexer_destroy(p->lexer);
+ parserutils_inputstream_destroy(p->stream);
+ alloc(p, 0, pw);
+ return css_error_from_parserutils_error(perror);
}
- perror = parserutils_stack_push(parser->states, (void *) &initial);
+ perror = parserutils_stack_push(p->states, (void *) &initial);
if (perror != PARSERUTILS_OK) {
- parserutils_stack_destroy(parser->open_items);
- parserutils_vector_destroy(parser->tokens);
- parserutils_dict_destroy(parser->dictionary);
- parserutils_stack_destroy(parser->states);
- css_lexer_destroy(parser->lexer);
- parserutils_inputstream_destroy(parser->stream);
- alloc(parser, 0, pw);
- return NULL;
+ parserutils_stack_destroy(p->open_items);
+ parserutils_vector_destroy(p->tokens);
+ parserutils_dict_destroy(p->dictionary);
+ parserutils_stack_destroy(p->states);
+ css_lexer_destroy(p->lexer);
+ parserutils_inputstream_destroy(p->stream);
+ alloc(p, 0, pw);
+ return css_error_from_parserutils_error(perror);
}
- parser->quirks = false;
- parser->pushback = NULL;
- parser->parseError = false;
- parser->match_char = 0;
- parser->event = NULL;
- parser->event_pw = NULL;
- parser->alloc = alloc;
- parser->pw = pw;
+ p->quirks = false;
+ p->pushback = NULL;
+ p->parseError = false;
+ p->match_char = 0;
+ p->event = NULL;
+ p->event_pw = NULL;
+ p->alloc = alloc;
+ p->pw = pw;
+
+ *parser = p;
- return parser;
+ return CSS_OK;
}
/**
* Destroy a CSS parser
*
* \param parser The parser instance to destroy
+ * \return CSS_OK on success, appropriate error otherwise
*/
-void css_parser_destroy(css_parser *parser)
+css_error css_parser_destroy(css_parser *parser)
{
if (parser == NULL)
- return;
+ return CSS_BADPARM;
parserutils_stack_destroy(parser->open_items);
@@ -296,6 +307,8 @@ void css_parser_destroy(css_parser *parser)
parserutils_inputstream_destroy(parser->stream);
parser->alloc(parser, 0, parser->pw);
+
+ return CSS_OK;
}
/**