]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1328: too many strlen() calls in indent.c v9.1.1328
authorJohn Marriott <basilisk@internode.on.net>
Mon, 21 Apr 2025 09:01:53 +0000 (11:01 +0200)
committerChristian Brabandt <cb@256bit.org>
Mon, 21 Apr 2025 09:03:21 +0000 (11:03 +0200)
Problem:  too many strlen() calls in indent.c
Solution: refactor indent.c slightly and remove strlen() calls
          (John Marriott)

closes: #17156

Signed-off-by: John Marriott <basilisk@internode.on.net>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/indent.c
src/version.c

index 6951cfcdb131700e162e58b8a16288eb8f3c328e..b2861e967483b5462fa9e11e6fc67ea0f0945ae9 100644 (file)
@@ -524,7 +524,7 @@ set_indent(
     char_u     *s;
     int                todo;
     int                ind_len;            // measured in characters
-    int                line_len;
+    int                line_len;           // size of the line (including the NUL)
     int                doit = FALSE;
     int                ind_done = 0;       // measured in spaces
 #ifdef FEAT_VARTABS
@@ -540,6 +540,7 @@ set_indent(
     todo = size;
     ind_len = 0;
     p = oldline = ml_get_curline();
+    line_len = ml_get_curline_len() + 1;
 
     // Calculate the buffer size for the new indent, and check to see if it
     // isn't already set
@@ -660,8 +661,10 @@ set_indent(
     if (flags & SIN_INSERT)
        p = oldline;
     else
+    {
        p = skipwhite(p);
-    line_len = (int)STRLEN(p) + 1;
+       line_len -= (int)(p - oldline);
+    }
 
     // If 'preserveindent' and 'expandtab' are both set keep the original
     // characters and allocate accordingly.  We will fill the rest with spaces
@@ -1330,7 +1333,7 @@ change_indent(
     // MODE_VREPLACE state needs to know what the line was like before changing
     if (State & VREPLACE_FLAG)
     {
-       orig_line = vim_strsave(ml_get_curline());  // Deal with NULL below
+       orig_line = vim_strnsave(ml_get_curline(), ml_get_curline_len());  // Deal with NULL below
        orig_col = curwin->w_cursor.col;
     }
 
@@ -1508,7 +1511,7 @@ change_indent(
            return;
 
        // Save new line
-       new_line = vim_strsave(ml_get_curline());
+       new_line = vim_strnsave(ml_get_curline(), ml_get_curline_len());
        if (new_line == NULL)
            return;
 
@@ -1758,6 +1761,7 @@ ex_retab(exarg_T *eap)
     for (lnum = eap->line1; !got_int && lnum <= eap->line2; ++lnum)
     {
        ptr = ml_get(lnum);
+       old_len = ml_get_len(lnum);
        col = 0;
        vcol = 0;
        did_undo = FALSE;
@@ -1821,7 +1825,6 @@ ex_retab(exarg_T *eap)
 
                        // len is actual number of white characters used
                        len = num_spaces + num_tabs;
-                       old_len = (long)STRLEN(ptr);
                        new_len = old_len - col + start_col + len + 1;
                        if (new_len <= 0 || new_len >= MAXCOL)
                        {
@@ -1845,6 +1848,7 @@ ex_retab(exarg_T *eap)
                            first_line = lnum;
                        last_line = lnum;
                        ptr = new_line;
+                       old_len = new_len - 1;
                        col = start_col + len;
                    }
                }
@@ -2000,8 +2004,7 @@ lisp_match(char_u *p)
 
     while (*word != NUL)
     {
-       (void)copy_option_part(&word, buf, LSIZE, ",");
-       len = (int)STRLEN(buf);
+       len = copy_option_part(&word, buf, LSIZE, ",");
        if (STRNCMP(buf, p, len) == 0 && IS_WHITE_OR_NUL(p[len]))
            return TRUE;
     }
index 36e94bc28b7578175b200095f07bfb70738538f1..40cff483e338a0f8b9bbfeebe9569a561b6112e4 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1328,
 /**/
     1327,
 /**/