summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
authorSébastien Helleu <flashcode@flashtux.org>2019-11-25 21:20:46 +0100
committerSébastien Helleu <flashcode@flashtux.org>2019-11-25 21:38:55 +0100
commit0044fa190256d9ab0ceb1fb140c6da4da115b56a (patch)
tree91ad9b5cad0ff780a20f2fed412ccadaeafd3fcd /src/gui
parent1a00368888118ed8d5aa620b164cc466fa005045 (diff)
downloadweechat-0044fa190256d9ab0ceb1fb140c6da4da115b56a.zip
core: remove allocation of string when salt is used (issue #635)
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/gui-nick.c84
1 files changed, 50 insertions, 34 deletions
diff --git a/src/gui/gui-nick.c b/src/gui/gui-nick.c
index c1ad7622a..032716234 100644
--- a/src/gui/gui-nick.c
+++ b/src/gui/gui-nick.c
@@ -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);
}