From 6792e16519fea61050cd5979c0a42d2a6b2f5bae Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Fri, 17 Jul 2009 16:33:25 +0000 Subject: Change mechanism for handling case sensitivity of element names. Now has another selection handler callback for this. Change selector hash to use an ASCII case-insensitive hash function. svn path=/trunk/libcss/; revision=8602 --- src/parse/language.c | 5 +---- src/select/hash.c | 17 +++++++++++++++-- src/select/select.c | 15 ++------------- 3 files changed, 18 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/parse/language.c b/src/parse/language.c index 0505f1f..27dd03e 100644 --- a/src/parse/language.c +++ b/src/parse/language.c @@ -981,11 +981,8 @@ css_error parseSimpleSelector(css_language *c, if (token->type == CSS_TOKEN_IDENT || tokenIsChar(token, '*')) { /* Have element name */ - /** \todo We need to know the case sensitivity of element - * names in the document language. For now, assume HTML, and - * thus insensitivity. */ error = css_stylesheet_selector_create(c->sheet, - token->ilower, &selector); + token->idata, &selector); if (error != CSS_OK) return error; diff --git a/src/select/hash.c b/src/select/hash.c index 62d5136..62df88c 100644 --- a/src/select/hash.c +++ b/src/select/hash.c @@ -305,13 +305,26 @@ uint32_t _hash(const css_selector *sel) } /** - * Name hash function + * Name hash function -- case-insensitive FNV. * * \param name Name to hash * \return hash value */ uint32_t _hash_name(lwc_string *name) { - return lwc_string_hash_value(name); + uint32_t z = 0x811c9dc5; + size_t len = lwc_string_length(name); + const char *data = lwc_string_data(name); + + while (len > 0) { + const char c = *data++; + + z *= 0x01000193; + z ^= ('A' <= c && c <= 'Z') ? (c + 'a' - 'A') : c; + + len--; + } + + return z; } diff --git a/src/select/select.c b/src/select/select.c index e8feb36..ca1a3c0 100644 --- a/src/select/select.c +++ b/src/select/select.c @@ -962,19 +962,8 @@ css_error match_detail(css_select_ctx *ctx, void *node, lwc_string_data(detail->name)[0] == '*') { *match = true; } else { - lwc_string *element; - error = state->handler->node_name(state->pw, node, - state->sheet->dictionary, &element); - if (error == CSS_OK) { - /** \todo Consider stylesheet's case flag */ - lwc_context_string_isequal( - state->sheet->dictionary, - element, detail->name, match); - - lwc_context_string_unref( - state->sheet->dictionary, - element); - } + error = state->handler->node_has_name(state->pw, node, + detail->name, match); } break; case CSS_SELECTOR_CLASS: -- cgit v1.2.3