summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--handle.c16
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) {