irc: optimize search of a nick in nicklist (up to 3x faster)

This commit is contained in:
Sébastien Helleu 2015-04-29 21:20:08 +02:00
parent 9793649e79
commit 499f36a7cf
4 changed files with 27 additions and 4 deletions

View File

@ -37,6 +37,7 @@ https://weechat.org/files/releasenotes/ReleaseNotes-devel.html[release notes]
* api: add support of full color option name in functions color() and
string_eval_expression() and in command /eval
* api: add "_chat_line" (line pointer) in hashtable of hook_focus
* irc: optimize search of a nick in nicklist (up to 3x faster)
* irc: add support of SHA-256 and SHA-512 algorithms in server option
"ssl_fingerprint" (closes #281)
* irc: add option "-noswitch" in command /query (closes #394)

View File

@ -180,12 +180,22 @@ irc_buffer_nickcmp_cb (void *data,
const char *nick1,
const char *nick2)
{
IRC_BUFFER_GET_SERVER(buffer);
struct t_irc_server *server;
/* make C compiler happy */
(void) data;
if (data)
server = (struct t_irc_server *)data;
else
irc_buffer_get_server_and_channel (buffer, &server, NULL);
return irc_server_strcasecmp (ptr_server, nick1, nick2);
if (server)
{
return irc_server_strcasecmp (server, nick1, nick2);
}
else
{
/* default is RFC 1459 casemapping comparison */
return weechat_strcasecmp_range (nick1, nick2, 29);
}
}
/*

View File

@ -351,6 +351,8 @@ irc_channel_create_buffer (struct t_irc_server *server,
weechat_buffer_set (ptr_buffer, "nicklist_display_groups", "0");
weechat_buffer_set_pointer (ptr_buffer, "nickcmp_callback",
&irc_buffer_nickcmp_cb);
weechat_buffer_set_pointer (ptr_buffer, "nickcmp_callback_data",
server);
}
/* set highlights settings on channel buffer */

View File

@ -245,6 +245,7 @@ irc_upgrade_set_buffer_callbacks ()
{
struct t_infolist *infolist;
struct t_gui_buffer *ptr_buffer;
struct t_irc_server *ptr_server;
const char *type;
infolist = weechat_infolist_get ("buffer", NULL, NULL);
@ -260,8 +261,17 @@ irc_upgrade_set_buffer_callbacks ()
type = weechat_buffer_get_string (ptr_buffer, "localvar_type");
if (type && (strcmp (type, "channel") == 0))
{
ptr_server = irc_server_search (
weechat_buffer_get_string (ptr_buffer,
"localvar_server"));
weechat_buffer_set_pointer (ptr_buffer, "nickcmp_callback",
&irc_buffer_nickcmp_cb);
if (ptr_server)
{
weechat_buffer_set_pointer (ptr_buffer,
"nickcmp_callback_data",
ptr_server);
}
}
if (strcmp (weechat_infolist_string (infolist, "name"),
IRC_RAW_BUFFER_NAME) == 0)