From 62dfe2ac63d4ce9c4c3f3c5d51cc9e9b227d2cd5 Mon Sep 17 00:00:00 2001 From: Simmo Saan Date: Mon, 18 Feb 2019 11:48:48 +0200 Subject: aspell: optimize stripping of nick_completer (issue #1306) --- src/plugins/aspell/weechat-aspell.c | 60 +++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 15 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/aspell/weechat-aspell.c b/src/plugins/aspell/weechat-aspell.c index 83bd16efe..6151f5be7 100644 --- a/src/plugins/aspell/weechat-aspell.c +++ b/src/plugins/aspell/weechat-aspell.c @@ -52,6 +52,9 @@ struct t_weechat_plugin *weechat_aspell_plugin = NULL; int aspell_enabled = 0; +char *aspell_nick_completer = NULL; +int aspell_len_nick_completer = 0; + #ifdef USE_ENCHANT EnchantBroker *broker = NULL; #endif /* USE_ENCHANT */ @@ -354,28 +357,19 @@ weechat_aspell_string_is_url (const char *word) int weechat_aspell_string_is_nick (struct t_gui_buffer *buffer, const char *word) { - char *nick_completer, *pos, *pos_nick_completer, *pos_space, saved_char; + char *pos, *pos_nick_completer, *pos_space, saved_char; const char *buffer_type, *buffer_nick, *buffer_channel; - int rc, len_completer; - - nick_completer = weechat_string_strip ( - weechat_config_string ( - weechat_config_get ("weechat.completion.nick_completer")), - 0, 1, " "); - len_completer = (nick_completer) ? strlen (nick_completer) : 0; + int rc; - pos_nick_completer = (nick_completer) ? - strstr (word, nick_completer) : NULL; + pos_nick_completer = (aspell_nick_completer) ? + strstr (word, aspell_nick_completer) : NULL; pos_space = strchr (word, ' '); - if (nick_completer) - free (nick_completer); - pos = NULL; if (pos_nick_completer && pos_space) { if ((pos_nick_completer < pos_space) - && (pos_nick_completer + len_completer == pos_space)) + && (pos_nick_completer + aspell_len_nick_completer == pos_space)) { pos = pos_nick_completer; } @@ -384,7 +378,7 @@ weechat_aspell_string_is_nick (struct t_gui_buffer *buffer, const char *word) } else { - pos = (pos_nick_completer && !pos_nick_completer[len_completer]) ? + pos = (pos_nick_completer && !pos_nick_completer[aspell_len_nick_completer]) ? pos_nick_completer : pos_space; } @@ -1061,6 +1055,30 @@ weechat_aspell_debug_libs_cb (const void *pointer, void *data, return WEECHAT_RC_OK; } +/* + * Callback for changes to option "weechat.completion.nick_completer". + */ + +int +weechat_aspell_config_change_nick_completer_cb (const void *pointer, void *data, + const char *option, + const char *value) +{ + /* make C compiler happy */ + (void) pointer; + (void) data; + (void) option; + + if (aspell_nick_completer) + free (aspell_nick_completer); + + aspell_nick_completer = weechat_string_strip (value, 0, 1, " "); + aspell_len_nick_completer = + (aspell_nick_completer) ? strlen (aspell_nick_completer) : 0; + + return WEECHAT_RC_OK; +} + /* * Initializes aspell plugin. */ @@ -1114,6 +1132,15 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[]) weechat_hook_signal ("debug_libs", &weechat_aspell_debug_libs_cb, NULL, NULL); + weechat_hook_config ("weechat.completion.nick_completer", + &weechat_aspell_config_change_nick_completer_cb, + NULL, NULL); + /* manually call callback to initialize */ + weechat_aspell_config_change_nick_completer_cb ( + NULL, NULL, "weechat.completion.nick_completer", + weechat_config_string ( + weechat_config_get ("weechat.completion.nick_completer"))); + return WEECHAT_RC_OK; } @@ -1137,5 +1164,8 @@ weechat_plugin_end (struct t_weechat_plugin *plugin) enchant_broker_free (broker); #endif /* USE_ENCHANT */ + if (aspell_nick_completer) + free (aspell_nick_completer); + return WEECHAT_RC_OK; } -- cgit v1.2.3