From 44bcf7b471d096d142c29f7f218d4f8b9c3742f8 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 30 Nov 2008 22:16:10 +0000 Subject: Make getToken reduce consecutive whitespace tokens to a single whitespace token. Update eatWS appropriately. This reduces the number of calls to getToken by a million or so. svn path=/trunk/libcss/; revision=5855 --- src/parse/parse.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/parse/parse.c b/src/parse/parse.c index dc88450..54b37d8 100644 --- a/src/parse/parse.c +++ b/src/parse/parse.c @@ -102,6 +102,8 @@ struct css_parser uint8_t match_char; /**< Close bracket type for parseAny */ + bool last_was_ws; /**< Last token was whitespace */ + css_parser_event_handler event; /**< Client's event handler */ void *event_pw; /**< Client data for event handler */ @@ -266,6 +268,7 @@ css_error css_parser_create(const char *charset, css_charset_source cs_source, p->parseError = false; p->match_char = 0; p->event = NULL; + p->last_was_ws = false; p->event_pw = NULL; p->alloc = alloc; p->pw = pw; @@ -569,6 +572,14 @@ css_error getToken(css_parser *parser, const css_token **token) if (error != CSS_OK) return error; + /* If the last token read was whitespace, keep reading + * tokens until we encounter one that isn't whitespace */ + while (parser->last_was_ws && t->type == CSS_TOKEN_S) { + error = css_lexer_get_token(parser->lexer, &t); + if (error != CSS_OK) + return error; + } + /** \todo We need only intern for the following token types: * * CSS_TOKEN_IDENT, CSS_TOKEN_ATKEYWORD, CSS_TOKEN_STRING, @@ -662,6 +673,8 @@ css_error getToken(css_parser *parser, const css_token **token) if (perror != PARSERUTILS_OK) return css_error_from_parserutils_error(perror); + parser->last_was_ws = ((*token)->type == CSS_TOKEN_S); + return CSS_OK; } @@ -699,17 +712,14 @@ css_error eatWS(css_parser *parser) const css_token *token; css_error error; - while (1) { - error = getToken(parser, &token); + error = getToken(parser, &token); + if (error != CSS_OK) + return error; + + if (token->type != CSS_TOKEN_S) { + error = pushBack(parser, token); if (error != CSS_OK) return error; - - if (token->type != CSS_TOKEN_S) { - error = pushBack(parser, token); - if (error != CSS_OK) - return error; - break; - } } return CSS_OK; -- cgit v1.2.3