diff options
Diffstat (limited to '')
-rw-r--r-- | handle.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/handle.c b/handle.c index 16a416c..c93522e 100644 --- a/handle.c +++ b/handle.c @@ -25,16 +25,22 @@ #include "chat.h" // Adapted from <https://github.com/cbreeden/fxhash/blob/master/lib.rs>. +static uint32_t hashChar(uint32_t hash, char ch) { + hash = (hash << 5) | (hash >> 27); + hash ^= ch; + hash *= 0x27220A95; + return hash; +} static int color(const char *str) { if (!str) return IRC_GRAY; uint32_t hash = 0; for (; str[0]; ++str) { - hash = (hash << 5) | (hash >> 27); - hash ^= str[0]; - hash *= 0x27220A95; + hash = hashChar(hash, str[0]); + } + while (IRC_BLACK == (hash & IRC_LIGHT_GRAY)) { + hash = hashChar(hash, '\0'); } - hash &= IRC_LIGHT_GRAY; - return (hash == IRC_BLACK) ? IRC_GRAY : hash; + return (hash & IRC_LIGHT_GRAY); } static char *paramField(char **params) { |