diff options
author | Daniel Silverstone <dsilvers@netsurf-browser.org> | 2009-02-14 17:12:25 +0000 |
---|---|---|
committer | Daniel Silverstone <dsilvers@netsurf-browser.org> | 2009-02-14 17:12:25 +0000 |
commit | df34246db5414c223618bb2107e94565ff444a84 (patch) | |
tree | e864ba1b9fc83da4e349b36029af8eb80ce798ef /src/libwapcaplet.c | |
parent | 41124cff3e5e20f7b7542bdfec653ef8e852c306 (diff) | |
download | libwapcaplet-df34246db5414c223618bb2107e94565ff444a84.tar.gz libwapcaplet-df34246db5414c223618bb2107e94565ff444a84.tar.bz2 |
More tests, some fixes. All the API appears to work
svn path=/trunk/libwapcaplet/; revision=6503
Diffstat (limited to 'src/libwapcaplet.c')
-rw-r--r-- | src/libwapcaplet.c | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/src/libwapcaplet.c b/src/libwapcaplet.c index cc80627..7b9817a 100644 --- a/src/libwapcaplet.c +++ b/src/libwapcaplet.c @@ -30,29 +30,6 @@ lwc_calculate_hash(const char *str, size_t len) return z; } -static inline char -dolower(const char c) -{ - if (c >= 'A' && c <= 'Z') - return c + 'a' - 'A'; - return c; -} - -static inline lwc_hash -lwc_calculate_lcase_hash(const char *str, size_t len) -{ - lwc_hash z = 0x811c9dc5; - - - while (len > 0) { - z *= 0x01000193; - z ^= dolower(*str++); - len--; - } - - return z; -} - struct lwc_string_s { lwc_string ** prevptr; lwc_string * next; @@ -161,7 +138,7 @@ __lwc_context_intern(lwc_context *ctx, while (str != NULL) { if ((str->hash == h) && (str->len == slen)) { - if (compare(s, CSTR_OF(str), slen) == 0) { + if (compare(CSTR_OF(str), s, slen) == 0) { str->refcnt++; *ret = str; return lwc_error_ok; @@ -177,7 +154,8 @@ __lwc_context_intern(lwc_context *ctx, str->prevptr = &(ctx->buckets[bucket]); str->next = ctx->buckets[bucket]; - ctx->buckets[bucket]->prevptr = &(str->next); + if (str->next != NULL) + str->next->prevptr = &(str->next); ctx->buckets[bucket] = str; str->len = slen; @@ -239,7 +217,9 @@ lwc_context_string_unref(lwc_context *ctx, lwc_string *str) return; *(str->prevptr) = str->next; - str->next->prevptr = str->prevptr; + + if (str->next != NULL) + str->next->prevptr = str->prevptr; if (str->insensitive != NULL) lwc_context_string_unref(ctx, str->insensitive); @@ -247,6 +227,31 @@ lwc_context_string_unref(lwc_context *ctx, lwc_string *str) LWC_FREE(str); } +/**** Shonky caseless bits ****/ + +static inline char +dolower(const char c) +{ + if (c >= 'A' && c <= 'Z') + return c + 'a' - 'A'; + return c; +} + +static inline lwc_hash +lwc_calculate_lcase_hash(const char *str, size_t len) +{ + lwc_hash z = 0x811c9dc5; + + + while (len > 0) { + z *= 0x01000193; + z ^= dolower(*str++); + len--; + } + + return z; +} + static int lwc_lcase_strcmp(const char *s1, const char *s2, size_t n) { |