summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-07-17 16:33:25 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-07-17 16:33:25 +0000
commit6792e16519fea61050cd5979c0a42d2a6b2f5bae (patch)
tree197abfe00c0cd7634af32bddb9f1bf5378c86548 /src
parentfdd5d5f6a27e1f072bd8ba0735c4c23c2456b8da (diff)
downloadlibcss-6792e16519fea61050cd5979c0a42d2a6b2f5bae.tar.gz
libcss-6792e16519fea61050cd5979c0a42d2a6b2f5bae.tar.bz2
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
Diffstat (limited to 'src')
-rw-r--r--src/parse/language.c5
-rw-r--r--src/select/hash.c17
-rw-r--r--src/select/select.c15
3 files changed, 18 insertions, 19 deletions
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: