]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0479: fuzzy_match_str_with_pos() does unnecessary list operations v9.1.0479
authorzeertzjq <zeertzjq@outlook.com>
Thu, 13 Jun 2024 15:14:27 +0000 (17:14 +0200)
committerChristian Brabandt <cb@256bit.org>
Thu, 13 Jun 2024 15:14:27 +0000 (17:14 +0200)
Problem:  fuzzy_match_str_with_pos() does unnecessary list operations.
Solution: Use fuzzy_match() directly (zeertzjq).

closes: #14987

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime/doc/syntax.txt
src/popupmenu.c
src/search.c
src/version.c

index eb1dd785661cca47bf6a3401117cb7ba4ff80b9e..7ec47bd83f10ae985bbba0775de01f26b4f16414 100644 (file)
@@ -1,4 +1,4 @@
-*syntax.txt*   For Vim version 9.1.  Last change: 2024 Jun 11
+*syntax.txt*   For Vim version 9.1.  Last change: 2024 Jun 13
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -5688,7 +5688,6 @@ PmenuThumb        Popup menu: Thumb of the scrollbar.
 PmenuMatch     Popup menu: Matched text in normal item
                                                        *hl-PmenuMatchSel*
 PmenuMatchSel  Popup menu: Matched text in selected item
-
                                                        *hl-PopupNotification*
 PopupNotification
                Popup window created with |popup_notification()|.  If not
index 00b0006181a41dc9ae7d174c89233b80b5ab156c..dd1a6ec99af67f0c586616718bed84a82edd6646 100644 (file)
@@ -463,8 +463,8 @@ pum_screen_put_with_attr(int row, int col, char_u *text, int textlen, int attr)
             // Handle fuzzy matching
             for (i = 0; i < ga->ga_len; i++)
             {
-                int *match_pos = ((int *)ga->ga_data) + i;
-                int actual_char_pos = 0;
+                int_u *match_pos = ((int_u *)ga->ga_data) + i;
+                int_u actual_char_pos = 0;
                 char_u *temp_ptr = text;
                 while (temp_ptr < ptr)
                 {
index 20bf399b20c1c9cac50c53adeadc978d6b48adc2..0b39d90b0e1a5f5b191e2c71d0f433592d7a797e 100644 (file)
@@ -5101,115 +5101,39 @@ fuzzy_match_str_with_pos(char_u *str UNUSED, char_u *pat UNUSED)
 {
 #ifdef FEAT_SEARCH_EXTRA
     int                    score = 0;
-    garray_T       *match_positions = ALLOC_ONE(garray_T);
-    typval_T       tv_str;
-    list_T         *l = NULL;
-    list_T         *retlist = NULL;
-    list_T         *match_str_list = NULL;
-    list_T         *match_pos_list = NULL;
-    list_T         *match_score_list = NULL;
-    listitem_T     *score_item = NULL;
-    listitem_T     *positions_item = NULL;
-    list_T         *positions_outer_list = NULL;
-    listitem_T     *outer_li = NULL;
-    list_T         *positions_inner_list = NULL;
+    garray_T       *match_positions = NULL;
+    int_u          matches[MAX_FUZZY_MATCHES];
+    int                    j = 0;
 
-    if (match_positions == NULL)
-        return NULL;
-    ga_init2(match_positions, sizeof(int), 10);
     if (str == NULL || pat == NULL)
-    {
-        ga_clear(match_positions);
         return NULL;
-    }
-    l = list_alloc();
-    if (l == NULL)
-    {
-        ga_clear(match_positions);
-        return NULL;
-    }
-
-    tv_str.v_type = VAR_STRING;
-    tv_str.vval.v_string = vim_strsave(str);
-    if (tv_str.vval.v_string == NULL || list_append_tv(l, &tv_str) == FAIL)
-        goto cleanup;
-
-    retlist = list_alloc();
-    if (retlist == NULL)
-        goto cleanup;
 
-    match_str_list = list_alloc();
-    match_pos_list = list_alloc();
-    match_score_list = list_alloc();
-    if (match_str_list == NULL || match_pos_list == NULL || match_score_list == NULL)
-        goto cleanup;
-
-    list_append_list(retlist, match_str_list);
-    list_append_list(retlist, match_pos_list);
-    list_append_list(retlist, match_score_list);
-
-    fuzzy_match_in_list(l, pat, FALSE, NULL, NULL, TRUE, retlist, 1);
-
-    if (retlist->lv_len != 3)
-        goto cleanup;
+    match_positions = ALLOC_ONE(garray_T);
+    if (match_positions == NULL)
+        return NULL;
+    ga_init2(match_positions, sizeof(int_u), 10);
 
-    score_item = list_find(retlist, 2);
-    if (score_item != NULL && score_item->li_tv.v_type == VAR_LIST)
+    if (!fuzzy_match(str, pat, FALSE, &score, matches, MAX_FUZZY_MATCHES)
+           || score == 0)
     {
-        list_T *score_list = score_item->li_tv.vval.v_list;
-        if (score_list->lv_len > 0)
-        {
-            listitem_T *first_score_item = score_list->lv_first;
-            if (first_score_item != NULL && first_score_item->li_tv.v_type == VAR_NUMBER)
-                score = first_score_item->li_tv.vval.v_number;
-        }
+       ga_clear(match_positions);
+       vim_free(match_positions);
+       return NULL;
     }
-    if (score == 0)
-        goto cleanup;
 
-    positions_item = list_find(retlist, 1);
-    if (positions_item != NULL && positions_item->li_tv.v_type == VAR_LIST)
+    for (char_u *p = pat; *p != NUL; MB_PTR_ADV(p))
     {
-        positions_outer_list = positions_item->li_tv.vval.v_list;
-        if (positions_outer_list->lv_len > 0)
-        {
-            outer_li = positions_outer_list->lv_first;
-            if (outer_li != NULL && outer_li->li_tv.v_type == VAR_LIST)
-            {
-                positions_inner_list = outer_li->li_tv.vval.v_list;
-                for (listitem_T *li = positions_inner_list->lv_first; li != NULL; li = li->li_next)
-                {
-                    if (li->li_tv.v_type == VAR_NUMBER)
-                    {
-                        int pos = li->li_tv.vval.v_number;
-                        ga_grow(match_positions, 1);
-                        ((int *)match_positions->ga_data)[match_positions->ga_len] = pos;
-                        match_positions->ga_len++;
-                    }
-                }
-            }
-        }
+       if (!VIM_ISWHITE(PTR2CHAR(p)))
+       {
+           ga_grow(match_positions, 1);
+           ((int_u *)match_positions->ga_data)[match_positions->ga_len] =
+                                                                   matches[j];
+           match_positions->ga_len++;
+           j++;
+       }
     }
 
-    vim_free(tv_str.vval.v_string);
-    list_free(retlist);
-    list_free(l);
     return match_positions;
-
-cleanup:
-    vim_free(tv_str.vval.v_string);
-    if (match_str_list != NULL)
-        list_free(match_str_list);
-    if (match_pos_list != NULL)
-        list_free(match_pos_list);
-    if (match_score_list != NULL)
-        list_free(match_score_list);
-    if (retlist != NULL)
-        list_free(retlist);
-    if (l != NULL)
-        list_free(l);
-    ga_clear(match_positions);
-    return NULL;
 #else
     return NULL;
 #endif
index 4b695c01e2bdc7e0da9a4a3475701fa123da18db..5addf1a8d76cea2bca457b434940bc52ce527ec9 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    479,
 /**/
     478,
 /**/