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