]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1614: strlen() called too often for :spellrepall v9.0.1614
authorzeertzjq <zeertzjq@outlook.com>
Tue, 6 Jun 2023 14:59:59 +0000 (15:59 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 6 Jun 2023 14:59:59 +0000 (15:59 +0100)
Problem:    strlen() called too often for :spellrepall.
Solution:   Store the result in a variable. (closes #12497)

src/spell.c
src/testdir/test_spell.vim
src/version.c

index db70fcf48a06f454f3a4fe2eadde19cd35202d63..ef06ab3e06e369fad379a00125a1527bdc1219a9 100644 (file)
@@ -2890,7 +2890,6 @@ ex_spellrepall(exarg_T *eap UNUSED)
 {
     pos_T      pos = curwin->w_cursor;
     char_u     *frompat;
-    int                addlen;
     char_u     *line;
     char_u     *p;
     int                save_ws = p_ws;
@@ -2901,9 +2900,11 @@ ex_spellrepall(exarg_T *eap UNUSED)
        emsg(_(e_no_previous_spell_replacement));
        return;
     }
-    addlen = (int)(STRLEN(repl_to) - STRLEN(repl_from));
+    size_t     repl_from_len = STRLEN(repl_from);
+    size_t     repl_to_len = STRLEN(repl_to);
+    int                addlen = (int)(repl_to_len - repl_from_len);
 
-    frompat = alloc(STRLEN(repl_from) + 7);
+    frompat = alloc(repl_from_len + 7);
     if (frompat == NULL)
        return;
     sprintf((char *)frompat, "\\V\\<%s\\>", repl_from);
@@ -2922,14 +2923,14 @@ ex_spellrepall(exarg_T *eap UNUSED)
        // when changing "etc" to "etc.".
        line = ml_get_curline();
        if (addlen <= 0 || STRNCMP(line + curwin->w_cursor.col,
-                                              repl_to, STRLEN(repl_to)) != 0)
+                                                  repl_to, repl_to_len) != 0)
        {
            p = alloc(STRLEN(line) + addlen + 1);
            if (p == NULL)
                break;
            mch_memmove(p, line, curwin->w_cursor.col);
            STRCPY(p + curwin->w_cursor.col, repl_to);
-           STRCAT(p, line + curwin->w_cursor.col + STRLEN(repl_from));
+           STRCAT(p, line + curwin->w_cursor.col + repl_from_len);
            ml_replace(curwin->w_cursor.lnum, p, FALSE);
            changed_bytes(curwin->w_cursor.lnum, curwin->w_cursor.col);
 #if defined(FEAT_PROP_POPUP)
@@ -2945,7 +2946,7 @@ ex_spellrepall(exarg_T *eap UNUSED)
            }
            ++sub_nsubs;
        }
-       curwin->w_cursor.col += (colnr_T)STRLEN(repl_to);
+       curwin->w_cursor.col += (colnr_T)repl_to_len;
     }
 
     p_ws = save_ws;
index a42d4c7e987d4be4a665af57385f51b4d329ce50..3f7b028bcb7617e27c5840866035f906e36cc438 100644 (file)
@@ -281,7 +281,7 @@ func Test_compl_with_CTRL_X_CTRL_K_using_spell()
   set spell& spelllang& dictionary& ignorecase&
 endfunc
 
-func Test_spellreall()
+func Test_spellrepall()
   new
   set spell
   call assert_fails('spellrepall', 'E752:')
index 466209bcf86be4605f167ec1b154c806ea8dd15d..b20685a5998632466cbfafc0f759ce56b4b1bc57 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1614,
 /**/
     1613,
 /**/