]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.2.0351: repeat_string() can be improved v9.2.0351
authorYasuhiro Matsumoto <mattn.jp@gmail.com>
Wed, 15 Apr 2026 04:12:55 +0000 (04:12 +0000)
committerChristian Brabandt <cb@256bit.org>
Wed, 15 Apr 2026 04:12:55 +0000 (04:12 +0000)
Problem:  repeat_string() can be improved
Solution: Replace the for() loop by an exponential growing while loop
          (Yasuhiro Matsumoto)

closes: #19977

Signed-off-by: Yasuhiro Matsumoto <mattn.jp@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/evalfunc.c
src/version.c

index a0fb99b738fa856c1ea8e1f1ec20f294d7fcd41d..04774128dd7ded9c99e55f31e016b3e772f5ebaf 100644 (file)
@@ -10584,7 +10584,7 @@ repeat_string(typval_T *str_tv, int n, typval_T *rettv)
     int                slen;
     int                len;
     char_u     *r;
-    int                i;
+    int                done;
 
     p = tv_get_string(str_tv);
     rettv->v_type = VAR_STRING;
@@ -10599,8 +10599,17 @@ repeat_string(typval_T *str_tv, int n, typval_T *rettv)
     if (r == NULL)
        return;
 
-    for (i = 0; i < n; i++)
-       mch_memmove(r + i * slen, p, (size_t)slen);
+    mch_memmove(r, p, (size_t)slen);
+    done = slen;
+    while (done < len)
+    {
+       int copy_len = done;
+
+       if (copy_len > len - done)
+           copy_len = len - done;
+       mch_memmove(r + done, r, (size_t)copy_len);
+       done += copy_len;
+    }
     r[len] = NUL;
 
     rettv->vval.v_string = r;
index 9aef76d65e97f1a7b858ca61bc1201f79d4dd526..3c64afaa9276cc14ccfcccb7239f83b56644d46b 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    351,
 /**/
     350,
 /**/