summaryrefslogtreecommitdiff
path: root/src/select
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/select
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/select')
-rw-r--r--src/select/hash.c17
-rw-r--r--src/select/select.c15
2 files changed, 17 insertions, 15 deletions
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: