core: remove allocation of string when salt is used (issue #635)

v2.8-utf8proc
Sébastien Helleu 2019-11-25 21:20:46 +01:00
parent 1a00368888
commit 0044fa1902
1 changed files with 50 additions and 34 deletions

View File

@ -48,9 +48,7 @@ gui_nick_hash_color (const char *nickname)
{
uint64_t color;
uint32_t color_32;
int length;
char *str;
const char *ptr_nick;
const char *ptr_salt, *ptr_nick;
if (!nickname || !nickname[0])
return 0;
@ -61,22 +59,15 @@ gui_nick_hash_color (const char *nickname)
if (config_num_nick_colors == 0)
return 0;
str = NULL;
ptr_nick = nickname;
if (CONFIG_STRING(config_look_nick_color_hash_salt)
&& CONFIG_STRING(config_look_nick_color_hash_salt)[0])
ptr_salt = CONFIG_STRING(config_look_nick_color_hash_salt);
if (ptr_salt && ptr_salt[0])
{
length = strlen (CONFIG_STRING(config_look_nick_color_hash_salt)) +
strlen (nickname) + 1;
str = malloc (length);
if (str)
{
snprintf (str, length, "%s%s",
CONFIG_STRING(config_look_nick_color_hash_salt),
nickname);
ptr_nick = str;
}
ptr_nick = ptr_salt;
}
else
{
ptr_salt = NULL;
ptr_nick = nickname;
}
color = 0;
@ -86,47 +77,72 @@ gui_nick_hash_color (const char *nickname)
case CONFIG_LOOK_NICK_COLOR_HASH_DJB2:
/* variant of djb2 hash */
color = 5381;
while (ptr_nick && ptr_nick[0])
while (1)
{
color ^= (color << 5) + (color >> 2) + utf8_char_int (ptr_nick);
ptr_nick = utf8_next_char (ptr_nick);
while (ptr_nick && ptr_nick[0])
{
color ^= (color << 5) + (color >> 2) + utf8_char_int (ptr_nick);
ptr_nick = utf8_next_char (ptr_nick);
}
if (!ptr_salt)
break;
ptr_salt = NULL;
ptr_nick = nickname;
}
break;
case CONFIG_LOOK_NICK_COLOR_HASH_SUM:
/* sum of letters */
color = 0;
while (ptr_nick && ptr_nick[0])
while (1)
{
color += utf8_char_int (ptr_nick);
ptr_nick = utf8_next_char (ptr_nick);
while (ptr_nick && ptr_nick[0])
{
color += utf8_char_int (ptr_nick);
ptr_nick = utf8_next_char (ptr_nick);
}
if (!ptr_salt)
break;
ptr_salt = NULL;
ptr_nick = nickname;
}
break;
case CONFIG_LOOK_NICK_COLOR_HASH_DJB2_32:
/* variant of djb2 hash (using 32-bit integer) */
color_32 = 5381;
while (ptr_nick && ptr_nick[0])
while (1)
{
color_32 ^= (color_32 << 5) + (color_32 >> 2)
+ utf8_char_int (ptr_nick);
ptr_nick = utf8_next_char (ptr_nick);
while (ptr_nick && ptr_nick[0])
{
color_32 ^= (color_32 << 5) + (color_32 >> 2)
+ utf8_char_int (ptr_nick);
ptr_nick = utf8_next_char (ptr_nick);
}
if (!ptr_salt)
break;
ptr_salt = NULL;
ptr_nick = nickname;
}
color = color_32;
break;
case CONFIG_LOOK_NICK_COLOR_HASH_SUM_32:
/* sum of letters (using 32-bit integer) */
color_32 = 0;
while (ptr_nick && ptr_nick[0])
while (1)
{
color_32 += utf8_char_int (ptr_nick);
ptr_nick = utf8_next_char (ptr_nick);
while (ptr_nick && ptr_nick[0])
{
color_32 += utf8_char_int (ptr_nick);
ptr_nick = utf8_next_char (ptr_nick);
}
if (!ptr_salt)
break;
ptr_salt = NULL;
ptr_nick = nickname;
}
color = color_32;
break;
}
if (str)
free (str);
return (color % config_num_nick_colors);
}