patch 9.0.1614: strlen() called too often for :spellrepall

Problem:    strlen() called too often for :spellrepall.
Solution:   Store the result in a variable. (closes #12497)
This commit is contained in:
zeertzjq
2023-06-06 15:59:59 +01:00
committed by Bram Moolenaar
parent d1911a8e2b
commit 59f7038536
3 changed files with 10 additions and 7 deletions

View File

@ -2890,7 +2890,6 @@ ex_spellrepall(exarg_T *eap UNUSED)
{ {
pos_T pos = curwin->w_cursor; pos_T pos = curwin->w_cursor;
char_u *frompat; char_u *frompat;
int addlen;
char_u *line; char_u *line;
char_u *p; char_u *p;
int save_ws = p_ws; int save_ws = p_ws;
@ -2901,9 +2900,11 @@ ex_spellrepall(exarg_T *eap UNUSED)
emsg(_(e_no_previous_spell_replacement)); emsg(_(e_no_previous_spell_replacement));
return; 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) if (frompat == NULL)
return; return;
sprintf((char *)frompat, "\\V\\<%s\\>", repl_from); sprintf((char *)frompat, "\\V\\<%s\\>", repl_from);
@ -2922,14 +2923,14 @@ ex_spellrepall(exarg_T *eap UNUSED)
// when changing "etc" to "etc.". // when changing "etc" to "etc.".
line = ml_get_curline(); line = ml_get_curline();
if (addlen <= 0 || STRNCMP(line + curwin->w_cursor.col, 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); p = alloc(STRLEN(line) + addlen + 1);
if (p == NULL) if (p == NULL)
break; break;
mch_memmove(p, line, curwin->w_cursor.col); mch_memmove(p, line, curwin->w_cursor.col);
STRCPY(p + curwin->w_cursor.col, repl_to); 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); ml_replace(curwin->w_cursor.lnum, p, FALSE);
changed_bytes(curwin->w_cursor.lnum, curwin->w_cursor.col); changed_bytes(curwin->w_cursor.lnum, curwin->w_cursor.col);
#if defined(FEAT_PROP_POPUP) #if defined(FEAT_PROP_POPUP)
@ -2945,7 +2946,7 @@ ex_spellrepall(exarg_T *eap UNUSED)
} }
++sub_nsubs; ++sub_nsubs;
} }
curwin->w_cursor.col += (colnr_T)STRLEN(repl_to); curwin->w_cursor.col += (colnr_T)repl_to_len;
} }
p_ws = save_ws; p_ws = save_ws;

View File

@ -281,7 +281,7 @@ func Test_compl_with_CTRL_X_CTRL_K_using_spell()
set spell& spelllang& dictionary& ignorecase& set spell& spelllang& dictionary& ignorecase&
endfunc endfunc
func Test_spellreall() func Test_spellrepall()
new new
set spell set spell
call assert_fails('spellrepall', 'E752:') call assert_fails('spellrepall', 'E752:')

View File

@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1614,
/**/ /**/
1613, 1613,
/**/ /**/