diff options
author | Sébastien Helleu <flashcode@flashtux.org> | 2014-09-01 07:38:27 +0200 |
---|---|---|
committer | Sébastien Helleu <flashcode@flashtux.org> | 2014-09-01 11:51:04 +0200 |
commit | f0aa0a21b213a23fdd9f0ad4033f620824197c1b (patch) | |
tree | 0f605f298e27ff81d97081021f507a1d2f1bfce2 | |
parent | dda1a66fd738152e41fc2ab21e1d6835e2c43aab (diff) | |
download | weechat-f0aa0a21b213a23fdd9f0ad4033f620824197c1b.zip |
core: optimize completion by using arraylists
With arraylist (vs weelist), the completion is about 50x faster.
It is visible on "/help [+tab]".
-rw-r--r-- | src/core/wee-completion.c | 5 | ||||
-rw-r--r-- | src/gui/gui-bar-item.c | 27 | ||||
-rw-r--r-- | src/gui/gui-completion.c | 419 | ||||
-rw-r--r-- | src/gui/gui-completion.h | 13 | ||||
-rw-r--r-- | src/plugins/plugin-api.c | 2 |
5 files changed, 259 insertions, 207 deletions
diff --git a/src/core/wee-completion.c b/src/core/wee-completion.c index d4b77127d..e97c2d823 100644 --- a/src/core/wee-completion.c +++ b/src/core/wee-completion.c @@ -34,6 +34,7 @@ #include <unistd.h> #include "weechat.h" +#include "wee-arraylist.h" #include "wee-config.h" #include "wee-hashtable.h" #include "wee-hook.h" @@ -625,12 +626,12 @@ completion_list_add_nicks_cb (void *data, (void) completion_item; (void) buffer; - count_before = weelist_size (completion->completion_list); + count_before = completion->list->size; hook_completion_exec (completion->buffer->plugin, "nick", completion->buffer, completion); - if (weelist_size (completion->completion_list) == count_before) + if (completion->list->size == count_before) { /* * no plugin overrides nick completion => use default nick diff --git a/src/gui/gui-bar-item.c b/src/gui/gui-bar-item.c index 1fbeeaee2..e8d377ea5 100644 --- a/src/gui/gui-bar-item.c +++ b/src/gui/gui-bar-item.c @@ -29,6 +29,7 @@ #include <time.h> #include "../core/weechat.h" +#include "../core/wee-arraylist.h" #include "../core/wee-config.h" #include "../core/wee-hashtable.h" #include "../core/wee-hdata.h" @@ -1484,9 +1485,9 @@ gui_bar_item_default_completion (void *data, struct t_gui_bar_item *item, struct t_gui_buffer *buffer, struct t_hashtable *extra_info) { - int length; + int length, i; char *buf, str_number[64]; - struct t_gui_completion_partial *ptr_item; + struct t_gui_completion_word *ptr_completion_word; /* make C compiler happy */ (void) data; @@ -1495,37 +1496,39 @@ gui_bar_item_default_completion (void *data, struct t_gui_bar_item *item, (void) extra_info; if (!buffer || !buffer->completion - || !buffer->completion->partial_completion_list) + || (buffer->completion->partial_list->size == 0)) { return NULL; } length = 1; - for (ptr_item = buffer->completion->partial_completion_list; - ptr_item; ptr_item = ptr_item->next_item) + for (i = 0; i < buffer->completion->partial_list->size; i++) { - length += strlen (ptr_item->word) + 32; + ptr_completion_word = + (struct t_gui_completion_word *)(buffer->completion->partial_list->data[i]); + length += strlen (ptr_completion_word->word) + 32; } buf = malloc (length); if (buf) { buf[0] = '\0'; - for (ptr_item = buffer->completion->partial_completion_list; - ptr_item; ptr_item = ptr_item->next_item) + for (i = 0; i < buffer->completion->partial_list->size; i++) { + ptr_completion_word = + (struct t_gui_completion_word *)(buffer->completion->partial_list->data[i]); strcat (buf, GUI_COLOR_CUSTOM_BAR_FG); - strcat (buf, ptr_item->word); - if (ptr_item->count > 0) + strcat (buf, ptr_completion_word->word); + if (ptr_completion_word->count > 0) { strcat (buf, GUI_COLOR_CUSTOM_BAR_DELIM); strcat (buf, "("); snprintf (str_number, sizeof (str_number), - "%d", ptr_item->count); + "%d", ptr_completion_word->count); strcat (buf, str_number); strcat (buf, ")"); } - if (ptr_item->next_item) + if (i < buffer->completion->partial_list->size - 1) strcat (buf, " "); } } diff --git a/src/gui/gui-completion.c b/src/gui/gui-completion.c index eee784bca..37d3f3abf 100644 --- a/src/gui/gui-completion.c +++ b/src/gui/gui-completion.c @@ -33,6 +33,7 @@ #include <unistd.h> #include "../core/weechat.h" +#include "../core/wee-arraylist.h" #include "../core/wee-completion.h" #include "../core/wee-config.h" #include "../core/wee-hdata.h" @@ -51,6 +52,48 @@ int gui_completion_freeze = 0; /* 1 to freeze completions (do not */ /* + * Compares two words in completion list. + */ + +int +gui_completion_word_compare_cb (void *data, struct t_arraylist *arraylist, + void *pointer1, void *pointer2) +{ + struct t_gui_completion_word *completion_word1, *completion_word2; + + /* make C compiler happy */ + (void) data; + (void) arraylist; + + completion_word1 = (struct t_gui_completion_word *)pointer1; + completion_word2 = (struct t_gui_completion_word *)pointer2; + + return string_strcasecmp (completion_word1->word, completion_word2->word); +} + +/* + * Frees a word in completion list. + */ + +void +gui_completion_word_free_cb (void *data, struct t_arraylist *arraylist, + void *pointer) +{ + struct t_gui_completion_word *completion_word; + + /* make C compiler happy */ + (void) data; + (void) arraylist; + + completion_word = (struct t_gui_completion_word *)pointer; + + if (completion_word->word) + free (completion_word->word); + + free (completion_word); +} + +/* * Initializes completion for a buffer. */ @@ -70,7 +113,9 @@ gui_completion_buffer_init (struct t_gui_completion *completion, completion->add_space = 1; completion->force_partial_completion = 0; - completion->completion_list = weelist_new (); + completion->list = arraylist_new (32, 1, 0, + &gui_completion_word_compare_cb, NULL, + &gui_completion_word_free_cb, NULL); completion->word_found = NULL; completion->word_found_is_nick = 0; @@ -78,8 +123,10 @@ gui_completion_buffer_init (struct t_gui_completion *completion, completion->diff_size = 0; completion->diff_length = 0; - completion->partial_completion_list = NULL; - completion->last_partial_completion = NULL; + completion->partial_list = arraylist_new ( + 0, 0, 0, + &gui_completion_word_compare_cb, NULL, + &gui_completion_word_free_cb, NULL); } /* @@ -88,66 +135,23 @@ gui_completion_buffer_init (struct t_gui_completion *completion, * Returns pointer to new item, NULL if error. */ -struct t_gui_completion_partial * +struct t_gui_completion_word * gui_completion_partial_list_add (struct t_gui_completion *completion, const char *word, int count) { - struct t_gui_completion_partial *new_item; + struct t_gui_completion_word *new_completion_word; - new_item = malloc (sizeof (*new_item)); - if (new_item) + new_completion_word = malloc (sizeof (*new_completion_word)); + if (new_completion_word) { - new_item->word = strdup (word); - new_item->count = count; + new_completion_word->word = strdup (word); + new_completion_word->nick_completion = 0; + new_completion_word->count = count; - new_item->prev_item = completion->last_partial_completion; - if (completion->partial_completion_list) - (completion->last_partial_completion)->next_item = new_item; - else - completion->partial_completion_list = new_item; - completion->last_partial_completion = new_item; - new_item->next_item = NULL; + arraylist_add (completion->partial_list, new_completion_word); } - return new_item; -} - -/* - * Removes an item from partial completion list. - */ - -void -gui_completion_partial_list_free (struct t_gui_completion *completion, - struct t_gui_completion_partial *item) -{ - /* remove partial completion item from list */ - if (item->prev_item) - (item->prev_item)->next_item = item->next_item; - if (item->next_item) - (item->next_item)->prev_item = item->prev_item; - if (completion->partial_completion_list == item) - completion->partial_completion_list = item->next_item; - if (completion->last_partial_completion == item) - completion->last_partial_completion = item->prev_item; - - /* free data */ - if (item->word) - free (item->word); - - free (item); -} - -/* - * Removes partial completion list. - */ -void -gui_completion_partial_list_free_all (struct t_gui_completion *completion) -{ - while (completion->partial_completion_list) - { - gui_completion_partial_list_free (completion, - completion->partial_completion_list); - } + return new_completion_word; } /* @@ -169,17 +173,17 @@ gui_completion_free_data (struct t_gui_completion *completion) free (completion->args); completion->args = NULL; - if (completion->completion_list) + if (completion->list) { - weelist_free (completion->completion_list); - completion->completion_list = NULL; + arraylist_free (completion->list); + completion->list = NULL; } if (completion->word_found) free (completion->word_found); completion->word_found = NULL; - gui_completion_partial_list_free_all (completion); + arraylist_clear (completion->partial_list); } /* @@ -206,9 +210,9 @@ gui_completion_stop (struct t_gui_completion *completion) completion->context = GUI_COMPLETION_NULL; completion->position = -1; - if (completion->partial_completion_list) + if (completion->partial_list->size > 0) { - gui_completion_partial_list_free_all (completion); + arraylist_clear (completion->partial_list); (void) hook_signal_send ("partial_completion", WEECHAT_HOOK_SIGNAL_STRING, NULL); } @@ -369,7 +373,9 @@ void gui_completion_list_add (struct t_gui_completion *completion, const char *word, int nick_completion, const char *where) { + struct t_gui_completion_word *completion_word; char buffer[512]; + int index; if (!word || !word[0]) return; @@ -380,17 +386,37 @@ gui_completion_list_add (struct t_gui_completion *completion, const char *word, || (!nick_completion && (string_strncasecmp (completion->base_word, word, utf8_strlen (completion->base_word)) == 0))) { - if (nick_completion && (completion->base_word_pos == 0)) - { - snprintf (buffer, sizeof (buffer), "%s%s", - word, CONFIG_STRING(config_completion_nick_completer)); - weelist_add (completion->completion_list, buffer, where, - (nick_completion) ? (void *)1 : (void *)0); - } - else + completion_word = malloc (sizeof (*completion_word)); + if (completion_word) { - weelist_add (completion->completion_list, word, where, - (nick_completion) ? (void *)1 : (void *)0); + completion_word->nick_completion = nick_completion; + completion_word->count = 0; + + index = -1; + if (strcmp (where, WEECHAT_LIST_POS_BEGINNING) == 0) + { + completion->list->sorted = 0; + index = 0; + } + else if (strcmp (where, WEECHAT_LIST_POS_END) == 0) + { + completion->list->sorted = 0; + index = -1; + } + + if (nick_completion && (completion->base_word_pos == 0)) + { + snprintf (buffer, sizeof (buffer), "%s%s", + word, + CONFIG_STRING(config_completion_nick_completer)); + completion_word->word = strdup (buffer); + arraylist_insert (completion->list, index, completion_word); + } + else + { + completion_word->word = strdup (word); + arraylist_insert (completion->list, index, completion_word); + } } } } @@ -842,28 +868,32 @@ gui_completion_find_context (struct t_gui_completion *completion, */ int -gui_completion_common_prefix_size (struct t_weelist *list, +gui_completion_common_prefix_size (struct t_arraylist *list, const char *utf_char) { - struct t_weelist_item *ptr_item; char *ptr_first_item, *ptr_char, *next_char; + struct t_gui_completion_word *ptr_completion_word; + int i; - ptr_first_item = list->items->data; + ptr_first_item = ((struct t_gui_completion_word *)(list->data[0]))->word; ptr_char = ptr_first_item; while (ptr_char && ptr_char[0]) { next_char = utf8_next_char (ptr_char); - for (ptr_item = list->items->next_item; ptr_item; - ptr_item = ptr_item->next_item) + for (i = 1; i < list->size; i++) { + ptr_completion_word = + (struct t_gui_completion_word *)(list->data[i]); if (!utf_char - || (utf8_charcasecmp (utf_char, ptr_item->data) == 0)) + || (utf8_charcasecmp (utf_char, + ptr_completion_word->word) == 0)) { - if ((ptr_item->data[ptr_char - ptr_first_item] == '\0') - || (utf8_charcasecmp (ptr_char, - ptr_item->data + (ptr_char - ptr_first_item)) != 0)) + if ((ptr_completion_word->word[ptr_char - ptr_first_item] == '\0') + || (utf8_charcasecmp ( + ptr_char, + ptr_completion_word->word + (ptr_char - ptr_first_item)) != 0)) { return ptr_char - ptr_first_item; } @@ -883,65 +913,78 @@ void gui_completion_partial_build_list (struct t_gui_completion *completion, int common_prefix_size) { - int char_size, items_count; + int i, char_size, items_count, index; char utf_char[16], *word; - struct t_weelist *weelist_temp; - struct t_weelist_item *ptr_item, *next_item; + struct t_gui_completion_word *ptr_completion_word, *new_completion_word; + struct t_arraylist *list_temp; - gui_completion_partial_list_free_all (completion); + arraylist_clear (completion->partial_list); - if (!completion->completion_list || !completion->completion_list->items) + if (!completion->list || (completion->list->size == 0)) return; - weelist_temp = weelist_new (); - if (!weelist_temp) + list_temp = arraylist_new (completion->list->size, 0, 0, + &gui_completion_word_compare_cb, NULL, + &gui_completion_word_free_cb, NULL); + if (!list_temp) return; - for (ptr_item = completion->completion_list->items; ptr_item; - ptr_item = ptr_item->next_item) + for (i = 0; i < completion->list->size; i++) { - weelist_add (weelist_temp, ptr_item->data + common_prefix_size, - WEECHAT_LIST_POS_END, NULL); + ptr_completion_word = + (struct t_gui_completion_word *)completion->list->data[i]; + new_completion_word = malloc (sizeof (*new_completion_word)); + if (new_completion_word) + { + new_completion_word->word = strdup ( + ptr_completion_word->word + common_prefix_size); + new_completion_word->nick_completion = 0; + new_completion_word->count = 0; + arraylist_add (list_temp, new_completion_word); + } } - while (weelist_temp->items) + while (list_temp->size > 0) { - char_size = utf8_char_size (weelist_temp->items->data); - memcpy (utf_char, weelist_temp->items->data, char_size); + ptr_completion_word = + (struct t_gui_completion_word *)list_temp->data[0]; + char_size = utf8_char_size (ptr_completion_word->word); + memcpy (utf_char, ptr_completion_word->word, char_size); utf_char[char_size] = '\0'; word = NULL; - common_prefix_size = gui_completion_common_prefix_size (weelist_temp, + common_prefix_size = gui_completion_common_prefix_size (list_temp, utf_char); if (common_prefix_size > 0) { - word = string_strndup (weelist_temp->items->data, + word = string_strndup (ptr_completion_word->word, common_prefix_size); } items_count = 0; - ptr_item = weelist_temp->items; - while (ptr_item) + index = 0; + while (index < list_temp->size) { - next_item = ptr_item->next_item; - - if (utf8_charcasecmp (utf_char, ptr_item->data) == 0) + ptr_completion_word = + (struct t_gui_completion_word *)list_temp->data[index]; + if (utf8_charcasecmp (utf_char, ptr_completion_word->word) == 0) { - weelist_remove (weelist_temp, ptr_item); + arraylist_remove (list_temp, index); items_count++; } - - ptr_item = next_item; + else + index++; } if (word) { - gui_completion_partial_list_add (completion, - word, - CONFIG_BOOLEAN(config_completion_partial_completion_count) ? - items_count : -1); + gui_completion_partial_list_add ( + completion, + word, + CONFIG_BOOLEAN(config_completion_partial_completion_count) ? + items_count : -1); free (word); } } - weelist_free (weelist_temp); + arraylist_free (list_temp); } /* @@ -952,8 +995,8 @@ void gui_completion_complete (struct t_gui_completion *completion) { int length, word_found_seen, other_completion, partial_completion; - int common_prefix_size, item_is_nick; - struct t_weelist_item *ptr_item, *ptr_item2; + int common_prefix_size, index, index2; + struct t_gui_completion_word *ptr_completion_word, *ptr_completion_word2; length = utf8_strlen (completion->base_word); word_found_seen = 0; @@ -977,21 +1020,12 @@ gui_completion_complete (struct t_gui_completion *completion) common_prefix_size = 0; if (partial_completion - && completion->completion_list && completion->completion_list->items) + && completion->list && (completion->list->size > 0)) { - common_prefix_size = gui_completion_common_prefix_size (completion->completion_list, + common_prefix_size = gui_completion_common_prefix_size (completion->list, NULL); } - ptr_item = NULL; - if (completion->completion_list) - { - if (completion->direction < 0) - ptr_item = completion->completion_list->last_item; - else - ptr_item = completion->completion_list->items; - } - if (partial_completion && completion->word_found && (utf8_strlen (completion->word_found) >= common_prefix_size)) @@ -999,59 +1033,68 @@ gui_completion_complete (struct t_gui_completion *completion) return; } - while (ptr_item) + index = -1; + if (completion->list) + { + if (completion->direction < 0) + index = completion->list->size - 1; + else + index = 0; + } + + while ((index >= 0) && (index < completion->list->size)) { - item_is_nick = ((long)(ptr_item->user_data) == 1); - if ((item_is_nick - && (gui_completion_nickncmp (completion->base_word, ptr_item->data, + ptr_completion_word = + (struct t_gui_completion_word *)(completion->list->data[index]); + if ((ptr_completion_word->nick_completion + && (gui_completion_nickncmp (completion->base_word, + ptr_completion_word->word, length) == 0)) - || ((!item_is_nick) - && (string_strncasecmp (completion->base_word, ptr_item->data, + || (!ptr_completion_word->nick_completion + && (string_strncasecmp (completion->base_word, + ptr_completion_word->word, length) == 0))) { if ((!completion->word_found) || word_found_seen) { if (completion->word_found) free (completion->word_found); - completion->word_found = strdup (ptr_item->data); - completion->word_found_is_nick = item_is_nick; - if (item_is_nick + completion->word_found = strdup (ptr_completion_word->word); + completion->word_found_is_nick = + ptr_completion_word->nick_completion; + if (ptr_completion_word->nick_completion && !CONFIG_BOOLEAN(config_completion_nick_add_space)) { completion->add_space = 0; } /* stop after first nick if user asked that */ - if (item_is_nick + if (ptr_completion_word->nick_completion && CONFIG_BOOLEAN(config_completion_nick_first_only)) { gui_completion_stop (completion); return; } - if (completion->direction < 0) - ptr_item2 = ptr_item->prev_item; - else - ptr_item2 = ptr_item->next_item; - - while (ptr_item2) + index2 = (completion->direction < 0) ? index - 1 : index + 1; + while ((index2 >= 0) && (index2 < completion->list->size)) { - if ((item_is_nick + ptr_completion_word2 = + (struct t_gui_completion_word *)(completion->list->data[index2]); + if ((ptr_completion_word->nick_completion && (gui_completion_nickncmp (completion->base_word, - ptr_item2->data, + ptr_completion_word2->word, length) == 0)) - || ((!item_is_nick) + || (!ptr_completion_word->nick_completion && (string_strncasecmp (completion->base_word, - ptr_item2->data, + ptr_completion_word2->word, length) == 0))) { other_completion++; } - if (completion->direction < 0) - ptr_item2 = ptr_item2->prev_item; - else - ptr_item2 = ptr_item2->next_item; + index2 = (completion->direction < 0) ? + index2 - 1 : index2 + 1; } if (other_completion == 0) @@ -1086,20 +1129,17 @@ gui_completion_complete (struct t_gui_completion *completion) return; } - gui_completion_partial_list_free_all (completion); + arraylist_clear (completion->partial_list); return; } other_completion++; } if (completion->word_found && - (strcmp (ptr_item->data, completion->word_found) == 0)) + (strcmp (ptr_completion_word->word, completion->word_found) == 0)) word_found_seen = 1; - if (completion->direction < 0) - ptr_item = ptr_item->prev_item; - else - ptr_item = ptr_item->next_item; + index = (completion->direction < 0) ? index - 1 : index + 1; } /* @@ -1124,7 +1164,7 @@ gui_completion_command (struct t_gui_completion *completion) { struct t_hook *ptr_hook; - if (!completion->completion_list->items) + if (completion->list->size == 0) { for (ptr_hook = weechat_hooks[HOOK_TYPE_COMMAND]; ptr_hook; ptr_hook = ptr_hook->next_hook) @@ -1154,18 +1194,19 @@ gui_completion_auto (struct t_gui_completion *completion) if ((completion->base_word[0] == '/') || (completion->base_word[0] == '~')) { - if (!completion->completion_list->items) + if (completion->list->size == 0) completion_list_add_filename_cb (NULL, NULL, NULL, completion); gui_completion_complete (completion); return; } /* use default template completion */ - if (!completion->completion_list->items) + if (completion->list->size == 0) { - gui_completion_build_list_template (completion, - CONFIG_STRING(config_completion_default_template), - NULL); + gui_completion_build_list_template ( + completion, + CONFIG_STRING(config_completion_default_template), + NULL); } gui_completion_complete (completion); } @@ -1205,7 +1246,7 @@ gui_completion_search (struct t_gui_completion *completion, int direction, gui_completion_command (completion); break; case GUI_COMPLETION_COMMAND_ARG: - if (completion->completion_list->items) + if (completion->list->size > 0) gui_completion_complete (completion); else { @@ -1286,24 +1327,23 @@ gui_completion_hdata_completion_cb (void *data, const char *hdata_name) HDATA_VAR(struct t_gui_completion, direction, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_completion, add_space, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_completion, force_partial_completion, INTEGER, 0, NULL, NULL); - HDATA_VAR(struct t_gui_completion, completion_list, POINTER, 0, NULL, NULL); + HDATA_VAR(struct t_gui_completion, list, POINTER, 0, NULL, NULL); HDATA_VAR(struct t_gui_completion, word_found, STRING, 0, NULL, NULL); HDATA_VAR(struct t_gui_completion, word_found_is_nick, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_completion, position_replace, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_completion, diff_size, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_completion, diff_length, INTEGER, 0, NULL, NULL); - HDATA_VAR(struct t_gui_completion, partial_completion_list, POINTER, 0, NULL, "completion_partial"); - HDATA_VAR(struct t_gui_completion, last_partial_completion, POINTER, 0, NULL, "completion_partial"); + HDATA_VAR(struct t_gui_completion, partial_list, POINTER, 0, NULL, NULL); } return hdata; } /* - * Returns hdata for partial completion. + * Returns hdata for completion word. */ struct t_hdata * -gui_completion_hdata_completion_partial_cb (void *data, const char *hdata_name) +gui_completion_hdata_completion_word_cb (void *data, const char *hdata_name) { struct t_hdata *hdata; @@ -1314,23 +1354,41 @@ gui_completion_hdata_completion_partial_cb (void *data, const char *hdata_name) 0, 0, NULL, NULL); if (hdata) { - HDATA_VAR(struct t_gui_completion_partial, word, STRING, 0, NULL, NULL); - HDATA_VAR(struct t_gui_completion_partial, count, INTEGER, 0, NULL, NULL); - HDATA_VAR(struct t_gui_completion_partial, prev_item, POINTER, 0, NULL, hdata_name); - HDATA_VAR(struct t_gui_completion_partial, next_item, POINTER, 0, NULL, hdata_name); + HDATA_VAR(struct t_gui_completion_word, word, STRING, 0, NULL, NULL); + HDATA_VAR(struct t_gui_completion_word, nick_completion, CHAR, 0, NULL, NULL); + HDATA_VAR(struct t_gui_completion_word, count, INTEGER, 0, NULL, NULL); } return hdata; } /* + * Prints list of completion words in WeeChat log file (usually for crash dump). + */ + +void +gui_completion_list_words_print_log (struct t_arraylist *list, + const char *name) +{ + int i; + struct t_gui_completion_word *ptr_completion_word; + + for (i = 0; i < list->size; i++) + { + ptr_completion_word = (struct t_gui_completion_word *)(list->data[i]); + log_printf ("[%s (addr:0x%lx)]", name, ptr_completion_word); + log_printf (" word. . . . . . . . . . : '%s'", ptr_completion_word->word); + log_printf (" nicklist_completion . . : %d", ptr_completion_word->nick_completion); + log_printf (" count . . . . . . . . . : %d", ptr_completion_word->count); + } +} + +/* * Prints completion list in WeeChat log file (usually for crash dump). */ void gui_completion_print_log (struct t_gui_completion *completion) { - struct t_gui_completion_partial *ptr_item; - log_printf ("[completion (addr:0x%lx)]", completion); log_printf (" buffer. . . . . . . . . : 0x%lx", completion->buffer); log_printf (" context . . . . . . . . : %d", completion->context); @@ -1343,29 +1401,22 @@ gui_completion_print_log (struct t_gui_completion *completion) log_printf (" direction . . . . . . . : %d", completion->direction); log_printf (" add_space . . . . . . . : %d", completion->add_space); log_printf (" force_partial_completion: %d", completion->force_partial_completion); - log_printf (" completion_list . . . . : 0x%lx", completion->completion_list); + log_printf (" list. . . . . . . . . . : 0x%lx", completion->list); log_printf (" word_found. . . . . . . : '%s'", completion->word_found); log_printf (" word_found_is_nick. . . : %d", completion->word_found_is_nick); log_printf (" position_replace. . . . : %d", completion->position_replace); log_printf (" diff_size . . . . . . . : %d", completion->diff_size); log_printf (" diff_length . . . . . . : %d", completion->diff_length); - if (completion->completion_list) + if (completion->list) { log_printf (""); - weelist_print_log (completion->completion_list, - "completion list element"); + gui_completion_list_words_print_log (completion->list, + "completion word"); } - if (completion->partial_completion_list) + if (completion->partial_list) { log_printf (""); - for (ptr_item = completion->partial_completion_list; - ptr_item; ptr_item = ptr_item->next_item) - { - log_printf ("[partial completion item (addr:0x%lx)]", ptr_item); - log_printf (" word. . . . . . . . . . : '%s'", ptr_item->word); - log_printf (" count . . . . . . . . . : %d", ptr_item->count); - log_printf (" prev_item . . . . . . . : 0x%lx", ptr_item->prev_item); - log_printf (" next_item . . . . . . . : 0x%lx", ptr_item->next_item); - } + arraylist_print_log (completion->partial_list, + "partial completion word"); } } diff --git a/src/gui/gui-completion.h b/src/gui/gui-completion.h index 7192779de..7c1368937 100644 --- a/src/gui/gui-completion.h +++ b/src/gui/gui-completion.h @@ -25,12 +25,12 @@ #define GUI_COMPLETION_COMMAND_ARG 2 #define GUI_COMPLETION_AUTO 3 -struct t_gui_completion_partial +struct t_gui_completion_word { - char *word; /* (partial) word matching completion */ + char *word; /* word matching completion */ + char nick_completion; /* 1 if it is completion of a nick */ int count; /* number of matching items with this word */ - struct t_gui_completion_partial *prev_item; - struct t_gui_completion_partial *next_item; + /* (for partial completion) */ }; struct t_gui_completion @@ -49,7 +49,7 @@ struct t_gui_completion int force_partial_completion; /* force partial completion? */ /* for command argument completion */ - struct t_weelist *completion_list; /* data list for completion */ + struct t_arraylist *list; /* data list for completion */ /* completion found */ char *word_found; /* word found (to replace base word) */ @@ -59,8 +59,7 @@ struct t_gui_completion int diff_length; /* length difference (<= diff_size) */ /* partial completion */ - struct t_gui_completion_partial *partial_completion_list; - struct t_gui_completion_partial *last_partial_completion; + struct t_arraylist *partial_list; }; /* completion variables */ diff --git a/src/plugins/plugin-api.c b/src/plugins/plugin-api.c index ca3c5ed5d..661939251 100644 --- a/src/plugins/plugin-api.c +++ b/src/plugins/plugin-api.c @@ -1298,8 +1298,6 @@ plugin_api_init () &gui_buffer_hdata_buffer_visited_cb, NULL); hook_hdata (NULL, "completion", N_("structure with completion"), &gui_completion_hdata_completion_cb, NULL); - hook_hdata (NULL, "completion_partial", N_("structure with partial completion"), - &gui_completion_hdata_completion_partial_cb, NULL); hook_hdata (NULL, "config_file", N_("config file"), &config_file_hdata_config_file_cb, NULL); hook_hdata (NULL, "config_section", N_("config section"), |