patch 9.2.0193: using copy_option_part() can be improved

Commit: 
https://github.com/vim/vim/commit/a74e5fc5b9cc3c1596f34df9d45e33f049162cfe
Author: John Marriott <[email protected]>
Date:   Wed Mar 18 19:25:22 2026 +0000

    patch 9.2.0193: using copy_option_part() can be improved
    
    Problem:  using copy_option_part() can be improved
    Solution: Refactor and use the return value of copy_option_part() to
              avoid strlen() calls (John Marriott).
    
    In addition, this commit includes the following changes:
    
    memline.c:
    - In recover_names():
      - Replace calls to vim_strsave() with vim_strnsave() for the literal
        strings
      - Use a string_T to store local variable dir_name.
    
    bufwrite.c:
    - In buf_write()
      - move variable wp to where it is used.
    
    help.c:
    - In fix_help_buffer():
      - replace call to add_pathsep() with after_pathsep()
    
    optionstr.c:
    - In export_myvimdir():
      - use a string_T to store local variable buf
      - replace call to add_pathsep() with after_pathsep()
    
    scriptfile.c:
    - In do_in_path():
      - use a string_T to store local variable buf
      - measure the lengths of prefix and name once before the while loop
      - replace call to add_pathsep() with after_pathsep()
      - move some variables closer to where they are used
    
    spellfile.c:
    - In init_spellfile():
      - use a string_T to store local variable buf
    
    closes: #19725
    
    Signed-off-by: John Marriott <[email protected]>
    Signed-off-by: Christian Brabandt <[email protected]>

diff --git a/src/bufwrite.c b/src/bufwrite.c
index 875619537..4d00421d9 100644
--- a/src/bufwrite.c
+++ b/src/bufwrite.c
@@ -1314,14 +1314,11 @@ buf_write(
                && (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) >= 0)
        {
            int         bfd;
-           char_u      *copybuf, *wp;
+           char_u      *copybuf;
            int         some_error = FALSE;
            stat_T      st_new;
            char_u      *dirp;
            char_u      *rootname;
-#if defined(UNIX) || defined(MSWIN)
-           char_u      *p;
-#endif
 #if defined(UNIX)
            int         did_set_shortname;
            mode_t      umask_save;
@@ -1347,6 +1344,9 @@ buf_write(
            dirp = p_bdir;
            while (*dirp)
            {
+               char_u  *p UNUSED;
+               int     copybuf_len UNUSED;
+
 #ifdef UNIX
                st_new.st_ino = 0;
                st_new.st_dev = 0;
@@ -1354,10 +1354,10 @@ buf_write(
 #endif
 
                // Isolate one directory name, using an entry in 'bdir'.
-               (void)copy_option_part(&dirp, copybuf, WRITEBUFSIZE, ",");
+               copybuf_len = copy_option_part(&dirp, copybuf, WRITEBUFSIZE, 
",");
 
 #if defined(UNIX) || defined(MSWIN)
-               p = copybuf + STRLEN(copybuf);
+               p = copybuf + copybuf_len;
                if (after_pathsep(copybuf, p) && p[-1] == p[-2])
                    // Ends with '//', use full path
                    if ((p = make_percent_swname(copybuf, p, fname)) != NULL)
@@ -1423,6 +1423,8 @@ buf_write(
                        // Change one character, just before the extension.
                        if (!p_bk)
                        {
+                           char_u      *wp;
+
                            wp = backup + STRLEN(backup) - 1
                                                         - STRLEN(backup_ext);
                            if (wp < backup)    // empty file name ???
@@ -1567,11 +1569,13 @@ buf_write(
            dirp = p_bdir;
            while (*dirp)
            {
+               int IObufflen UNUSED;
+
                // Isolate one directory name and make the backup file name.
-               (void)copy_option_part(&dirp, IObuff, IOSIZE, ",");
+               IObufflen = copy_option_part(&dirp, IObuff, IOSIZE, ",");
 
 #if defined(UNIX) || defined(MSWIN)
-               p = IObuff + STRLEN(IObuff);
+               p = IObuff + IObufflen;
                if (after_pathsep(IObuff, p) && p[-1] == p[-2])
                    // path ends with '//', use full path
                    if ((p = make_percent_swname(IObuff, p, fname)) != NULL)
diff --git a/src/change.c b/src/change.c
index 451aa99a0..ed6f442a2 100644
--- a/src/change.c
+++ b/src/change.c
@@ -1894,6 +1894,7 @@ open_line(
        char_u  *lead_repl = NULL;          // replaces comment leader
        int     lead_repl_len = 0;          // length of *lead_repl
        char_u  lead_middle[COM_MAX_LEN];   // middle-comment string
+       int     lead_middle_len;            // length of the lead_middle
        char_u  lead_end[COM_MAX_LEN];      // end-comment string
        char_u  *comment_end = NULL;        // where lead_end has been found
        int     extra_space = FALSE;        // append extra space
@@ -1934,7 +1935,7 @@ open_line(
                        require_blank = TRUE;
                    ++p;
                }
-               (void)copy_option_part(&p, lead_middle, COM_MAX_LEN, ",");
+               lead_middle_len = copy_option_part(&p, lead_middle, 
COM_MAX_LEN, ",");
 
                while (*p && p[-1] != ':')      // find end of end flags
                {
@@ -1967,7 +1968,7 @@ open_line(
                    if (current_flag == COM_START)
                    {
                        lead_repl = lead_middle;
-                       lead_repl_len = (int)STRLEN(lead_middle);
+                       lead_repl_len = lead_middle_len;
                    }
 
                    // If we have hit RETURN immediately after the start
diff --git a/src/cindent.c b/src/cindent.c
index 1e24975b9..1b4ad0fa4 100644
--- a/src/cindent.c
+++ b/src/cindent.c
@@ -2280,6 +2280,7 @@ get_c_indent(void)
        char_u  lead_start[COM_MAX_LEN];        // start-comment string
        char_u  lead_middle[COM_MAX_LEN];       // middle-comment string
        char_u  lead_end[COM_MAX_LEN];          // end-comment string
+       int     lead_end_len;
        char_u  *p;
        int     start_align = 0;
        int     start_off = 0;
@@ -2312,25 +2313,25 @@ get_c_indent(void)
 
            if (*p == ':')
                ++p;
-           (void)copy_option_part(&p, lead_end, COM_MAX_LEN, ",");
+           lead_end_len = copy_option_part(&p, lead_end, COM_MAX_LEN, ",");
            if (what == COM_START)
            {
                STRCPY(lead_start, lead_end);
-               lead_start_len = (int)STRLEN(lead_start);
+               lead_start_len = lead_end_len;
                start_off = off;
                start_align = align;
            }
            else if (what == COM_MIDDLE)
            {
                STRCPY(lead_middle, lead_end);
-               lead_middle_len = (int)STRLEN(lead_middle);
+               lead_middle_len = lead_end_len;
            }
            else if (what == COM_END)
            {
                // If our line starts with the middle comment string, line it
                // up with the comment opener per the 'comments' option.
                if (STRNCMP(theline, lead_middle, lead_middle_len) == 0
-                       && STRNCMP(theline, lead_end, STRLEN(lead_end)) != 0)
+                       && STRNCMP(theline, lead_end, lead_end_len) != 0)
                {
                    done = TRUE;
                    if (curwin->w_cursor.lnum > 1)
@@ -2366,7 +2367,7 @@ get_c_indent(void)
                // If our line starts with the end comment string, line it up
                // with the middle comment
                if (STRNCMP(theline, lead_middle, lead_middle_len) != 0
-                       && STRNCMP(theline, lead_end, STRLEN(lead_end)) == 0)
+                       && STRNCMP(theline, lead_end, lead_end_len) == 0)
                {
                    amount = get_indent_lnum(curwin->w_cursor.lnum - 1);
                                                                     // XXX
diff --git a/src/help.c b/src/help.c
index 1eb7ef6bb..7bb6a0d7d 100644
--- a/src/help.c
+++ b/src/help.c
@@ -775,7 +775,9 @@ fix_help_buffer(void)
            p = p_rtp;
            while (*p != NUL)
            {
-               copy_option_part(&p, NameBuff, MAXPATHL, ",");
+               int NameBufflen;
+
+               NameBufflen = copy_option_part(&p, NameBuff, MAXPATHL, ",");
                mustfree = FALSE;
                rt = vim_getenv((char_u *)"VIMRUNTIME", &mustfree);
                if (rt != NULL &&
@@ -790,11 +792,15 @@ fix_help_buffer(void)
                    char_u      *cp;
 
                    // Find all "doc/ *.txt" files in this directory.
-                   add_pathsep(NameBuff);
+                   if (*NameBuff != NUL && !after_pathsep(NameBuff, NameBuff + 
NameBufflen))
+                   {
+                       STRCPY(NameBuff + NameBufflen, PATHSEPSTR);
+                       NameBufflen += STRLEN_LITERAL(PATHSEPSTR);
+                   }
 #ifdef FEAT_MULTI_LANG
-                   STRCAT(NameBuff, "doc/*.??[tx]");
+                   STRCPY(NameBuff + NameBufflen, "doc/*.??[tx]");
 #else
-                   STRCAT(NameBuff, "doc/*.txt");
+                   STRCPY(NameBuff + NameBufflen, "doc/*.txt");
 #endif
                    if (gen_expand_wildcards(1, &NameBuff, &fcount,
                                         &fnames, EW_FILE|EW_SILENT) == OK
diff --git a/src/memline.c b/src/memline.c
index 58824ad11..9cca5c2f4 100644
--- a/src/memline.c
+++ b/src/memline.c
@@ -1898,7 +1898,7 @@ recover_names(
     int                file_count = 0;
     char_u     **files;
     char_u     *dirp;
-    char_u     *dir_name;
+    string_T   dir_name;
     char_u     *fname_res = NULL;
 #ifdef HAVE_READLINK
     char_u     fname_buf[MAXPATHL];
@@ -1927,35 +1927,35 @@ recover_names(
      * Do the loop for every directory in 'directory'.
      * First allocate some memory to put the directory name in.
      */
-    dir_name = alloc(STRLEN(p_dir) + 1);
+    dir_name.string = alloc(STRLEN(p_dir) + 1);
     dirp = p_dir;
-    while (dir_name != NULL && *dirp)
+    while (dir_name.string != NULL && *dirp)
     {
        /*
         * Isolate a directory name from *dirp and put it in dir_name (we know
         * it is large enough, so use 31000 for length).
         * Advance dirp to next directory name.
         */
-       (void)copy_option_part(&dirp, dir_name, 31000, ",");
+       dir_name.length = (size_t)copy_option_part(&dirp, dir_name.string, 
31000, ",");
 
-       if (dir_name[0] == '.' && dir_name[1] == NUL)   // check current dir
+       if (dir_name.string[0] == '.' && dir_name.string[1] == NUL)     // 
check current dir
        {
            if (fname == NULL)
            {
 #ifdef VMS
-               names[0] = vim_strsave((char_u *)"*_sw%");
+               names[0] = vim_strnsave((char_u *)"*_sw%", 
STRLEN_LITERAL("*_sw%"));
 #else
-               names[0] = vim_strsave((char_u *)"*.sw?");
+               names[0] = vim_strnsave((char_u *)"*.sw?", 
STRLEN_LITERAL("*.sw?"));
 #endif
 #if defined(UNIX) || defined(MSWIN)
                // For Unix names starting with a dot are special.  MS-Windows
                // supports this too, on some file systems.
-               names[1] = vim_strsave((char_u *)".*.sw?");
-               names[2] = vim_strsave((char_u *)".sw?");
+               names[1] = vim_strnsave((char_u *)".*.sw?", 
STRLEN_LITERAL(".*.sw?"));
+               names[2] = vim_strnsave((char_u *)".sw?", 
STRLEN_LITERAL(".sw?"));
                num_names = 3;
 #else
 # ifdef VMS
-               names[1] = vim_strsave((char_u *)".*_sw%");
+               names[1] = vim_strnsave((char_u *)".*_sw%", 
STRLEN_LITERAL(".*_sw%"));
                num_names = 2;
 # else
                num_names = 1;
@@ -1970,19 +1970,19 @@ recover_names(
            if (fname == NULL)
            {
 #ifdef VMS
-               names[0] = concat_fnames(dir_name, (char_u *)"*_sw%", TRUE);
+               names[0] = concat_fnames(dir_name.string, (char_u *)"*_sw%", 
TRUE);
 #else
-               names[0] = concat_fnames(dir_name, (char_u *)"*.sw?", TRUE);
+               names[0] = concat_fnames(dir_name.string, (char_u *)"*.sw?", 
TRUE);
 #endif
 #if defined(UNIX) || defined(MSWIN)
                // For Unix names starting with a dot are special.  MS-Windows
                // supports this too, on some file systems.
-               names[1] = concat_fnames(dir_name, (char_u *)".*.sw?", TRUE);
-               names[2] = concat_fnames(dir_name, (char_u *)".sw?", TRUE);
+               names[1] = concat_fnames(dir_name.string, (char_u *)".*.sw?", 
TRUE);
+               names[2] = concat_fnames(dir_name.string, (char_u *)".sw?", 
TRUE);
                num_names = 3;
 #else
 # ifdef VMS
-               names[1] = concat_fnames(dir_name, (char_u *)".*_sw%", TRUE);
+               names[1] = concat_fnames(dir_name.string, (char_u *)".*_sw%", 
TRUE);
                num_names = 2;
 # else
                num_names = 1;
@@ -1992,19 +1992,17 @@ recover_names(
            else
            {
 #if defined(UNIX) || defined(MSWIN)
-               int     len = (int)STRLEN(dir_name);
-
-               p = dir_name + len;
-               if (after_pathsep(dir_name, p) && len > 1 && p[-1] == p[-2])
+               p = dir_name.string + dir_name.length;
+               if (after_pathsep(dir_name.string, p) && dir_name.length > 1 && 
p[-1] == p[-2])
                {
                    // Ends with '//', Use Full path for swap name
-                   tail = make_percent_swname(dir_name, p, fname_res);
+                   tail = make_percent_swname(dir_name.string, p, fname_res);
                }
                else
 #endif
                {
                    tail = gettail(fname_res);
-                   tail = concat_fnames(dir_name, tail, TRUE);
+                   tail = concat_fnames(dir_name.string, tail, TRUE);
                }
                if (tail == NULL)
                    num_names = 0;
@@ -2101,7 +2099,7 @@ recover_names(
        }
        else if (do_list)
        {
-           if (dir_name[0] == '.' && dir_name[1] == NUL)
+           if (dir_name.string[0] == '.' && dir_name.string[1] == NUL)
            {
                if (fname == NULL)
                    msg_puts(_("   In current directory:
"));
@@ -2111,7 +2109,7 @@ recover_names(
            else
            {
                msg_puts(_("   In directory "));
-               msg_home_replace(dir_name);
+               msg_home_replace(dir_name.string);
                msg_puts(":
");
            }
 
@@ -2136,7 +2134,7 @@ recover_names(
        {
            for (int i = 0; i < num_files; ++i)
            {
-               char_u *name = concat_fnames(dir_name, files[i], TRUE);
+               char_u *name = concat_fnames(dir_name.string, files[i], TRUE);
                if (name != NULL)
                {
                    list_append_string(ret_list, name, -1);
@@ -2153,7 +2151,7 @@ recover_names(
        if (num_files > 0)
            FreeWild(num_files, files);
     }
-    vim_free(dir_name);
+    vim_free(dir_name.string);
     return file_count;
 }
 
diff --git a/src/optionstr.c b/src/optionstr.c
index 4f180d22a..8fefcb035 100644
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -5514,27 +5514,29 @@ export_myvimdir(void)
     int                dofree = FALSE;
     char_u     *p;
     char_u     *q = p_rtp;
-    char_u     *buf = alloc(MAXPATHL);
+    string_T   buf;
 
-    if (buf == NULL)
+    buf.string = alloc(MAXPATHL);
+    if (buf.string == NULL)
        return;
 
-    (void)copy_option_part(&q, buf, MAXPATHL, ",");
+    buf.length = (size_t)copy_option_part(&q, buf.string, MAXPATHL, ",");
 
     p = vim_getenv((char_u *)"MYVIMDIR", &dofree);
 
-    if (p == NULL || STRCMP(p, buf) != 0)
+    if (p == NULL || STRCMP(p, buf.string) != 0)
     {
-       add_pathsep(buf);
+       if (*buf.string != NUL && !after_pathsep(buf.string, buf.string + 
buf.length))
+           STRCPY(buf.string + buf.length, PATHSEPSTR);
 #ifdef MSWIN
        // normalize path separators
-       for (q = buf; *q != NUL; q++)
+       for (q = buf.string; *q != NUL; q++)
            if (*q == '/')
                *q = '\';
 #endif
-       vim_setenv((char_u *)"MYVIMDIR", buf);
+       vim_setenv((char_u *)"MYVIMDIR", buf.string);
     }
     if (dofree)
        vim_free(p);
-    vim_free(buf);
+    vim_free(buf.string);
 }
diff --git a/src/scriptfile.c b/src/scriptfile.c
index 70cbe993e..7750ba08e 100644
--- a/src/scriptfile.c
+++ b/src/scriptfile.c
@@ -590,10 +590,8 @@ do_in_path(
     void       *cookie)
 {
     char_u     *rtp;
-    char_u     *np;
-    char_u     *buf;
+    string_T   buf;
     char_u     *rtp_copy;
-    char_u     *tail;
     int                num_files;
     char_u     **files;
     int                i;
@@ -609,36 +607,42 @@ do_in_path(
     // Make a copy of 'runtimepath'.  Invoking the callback may change the
     // value.
     rtp_copy = vim_strsave(path);
-    buf = alloc(MAXPATHL);
-    if (buf != NULL && rtp_copy != NULL)
+    buf.string = alloc(MAXPATHL);
+    if (buf.string != NULL && rtp_copy != NULL)
     {
-       if (p_verbose > 10 && name != NULL)
+       size_t  prefixlen = 0;
+       size_t  namelen = 0;
+
+       if (name != NULL)
        {
-           verbose_enter();
-           if (*prefix != NUL)
-               smsg(_("Searching for \"%s\" under \"%s\" in \"%s\""),
-                                          (char *)name, prefix, (char *)path);
-           else
-               smsg(_("Searching for \"%s\" in \"%s\""),
-                                                  (char *)name, (char *)path);
-           verbose_leave();
+           prefixlen = STRLEN(prefix);
+           namelen = STRLEN(name);
+
+           if (p_verbose > 10)
+           {
+               verbose_enter();
+               if (*prefix != NUL)
+                   smsg(_("Searching for \"%s\" under \"%s\" in \"%s\""),
+                                              (char *)name, prefix, (char 
*)path);
+               else
+                   smsg(_("Searching for \"%s\" in \"%s\""),
+                                                      (char *)name, (char 
*)path);
+               verbose_leave();
+           }
        }
 
        // Loop over all entries in 'runtimepath'.
        rtp = rtp_copy;
        while (*rtp != NUL && ((flags & DIP_ALL) || !did_one))
        {
-           size_t buflen;
-
            // Copy the path from 'runtimepath' to buf[].
-           copy_option_part(&rtp, buf, MAXPATHL, ",");
-           buflen = STRLEN(buf);
+           buf.length = (size_t)copy_option_part(&rtp, buf.string, MAXPATHL, 
",");
 
            // Skip after or non-after directories.
            if (flags & (DIP_NOAFTER | DIP_AFTER))
            {
-               int is_after = buflen >= 5
-                                    && STRCMP(buf + buflen - 5, "after") == 0;
+               int is_after = buf.length >= 5
+                   && STRCMP(buf.string + buf.length - 5, "after") == 0;
 
                if ((is_after && (flags & DIP_NOAFTER))
                        || (!is_after && (flags & DIP_AFTER)))
@@ -647,33 +651,42 @@ do_in_path(
 
            if (name == NULL)
            {
-               (*callback)(buf, (void *) &cookie);
+               (*callback)(buf.string, (void *)&cookie);
                if (!did_one)
                    did_one = (cookie == NULL);
            }
-           else if (buflen + 2 + STRLEN(prefix) + STRLEN(name) < MAXPATHL)
+           else if (buf.length + 2 + prefixlen + namelen < MAXPATHL)
            {
-               add_pathsep(buf);
-               STRCAT(buf, prefix);
-               tail = buf + STRLEN(buf);
+               char_u  *np;
+               char_u  *tail;
+
+               if (*buf.string != NUL
+                   && !after_pathsep(buf.string, buf.string + buf.length))
+               {
+                   STRCPY(buf.string + buf.length, PATHSEPSTR);
+                   buf.length += STRLEN_LITERAL(PATHSEPSTR);
+               }
+               STRCPY(buf.string + buf.length, prefix);
+               buf.length += prefixlen;
+               tail = buf.string + buf.length;
 
                // Loop over all patterns in "name"
                np = name;
                while (*np != NUL && ((flags & DIP_ALL) || !did_one))
                {
                    // Append the pattern from "name" to buf[].
-                   copy_option_part(&np, tail, (int)(MAXPATHL - (tail - buf)),
+                   copy_option_part(&np, tail, (int)(MAXPATHL - (tail - 
buf.string)),
                                                                       "        
 ");
 
                    if (p_verbose > 10)
                    {
                        verbose_enter();
-                       smsg(_("Searching for \"%s\""), buf);
+                       smsg(_("Searching for \"%s\""), buf.string);
                        verbose_leave();
                    }
 
                    // Expand wildcards, invoke the callback for each match.
-                   if (gen_expand_wildcards(1, &buf, &num_files, &files,
+                   if (gen_expand_wildcards(1, &buf.string, &num_files, &files,
                                  (flags & DIP_DIR) ? EW_DIR : EW_FILE) == OK)
                    {
                        for (i = 0; i < num_files; ++i)
@@ -689,7 +702,7 @@ do_in_path(
            }
        }
     }
-    vim_free(buf);
+    vim_free(buf.string);
     vim_free(rtp_copy);
     if (!did_one && name != NULL)
     {
@@ -838,7 +851,7 @@ add_pack_dir_to_rtp(char_u *fname)
     char_u  *after_insp = NULL;
     char_u  *ffname = NULL;
     size_t  fname_len;
-    char_u  *buf = NULL;
+    string_T   buf = {NULL, 0};
     char_u  *rtp_ffname;
     int            match;
     int            retval = FAIL;
@@ -865,17 +878,17 @@ add_pack_dir_to_rtp(char_u *fname)
     // Find "ffname" in "p_rtp", ignoring '/' vs '\' differences.
     // Also stop at the first "after" directory.
     fname_len = STRLEN(ffname);
-    buf = alloc(MAXPATHL);
-    if (buf == NULL)
+    buf.string = alloc(MAXPATHL);
+    if (buf.string == NULL)
        goto theend;
     for (entry = p_rtp; *entry != NUL; )
     {
        char_u *cur_entry = entry;
 
-       copy_option_part(&entry, buf, MAXPATHL, ",");
+       buf.length = (size_t)copy_option_part(&entry, buf.string, MAXPATHL, 
",");
 
-       if ((p = (char_u *)strstr((char *)buf, "after")) != NULL
-               && p > buf
+       if ((p = (char_u *)strstr((char *)buf.string, "after")) != NULL
+               && p > buf.string
                && vim_ispathsep(p[-1])
                && (vim_ispathsep(p[5]) || p[5] == NUL || p[5] == ','))
        {
@@ -889,8 +902,9 @@ add_pack_dir_to_rtp(char_u *fname)
 
        if (insp == NULL)
        {
-           add_pathsep(buf);
-           rtp_ffname = fix_fname(buf);
+           if (*buf.string != NUL && !after_pathsep(buf.string, buf.string + 
buf.length))
+               STRCPY(buf.string + buf.length, PATHSEPSTR);
+           rtp_ffname = fix_fname(buf.string);
            if (rtp_ffname == NULL)
                goto theend;
            match = vim_fnamencmp(rtp_ffname, ffname, fname_len) == 0;
@@ -961,7 +975,7 @@ add_pack_dir_to_rtp(char_u *fname)
     retval = OK;
 
 theend:
-    vim_free(buf);
+    vim_free(buf.string);
     vim_free(ffname);
     vim_free(afterdir);
     return retval;
diff --git a/src/spell.c b/src/spell.c
index d06a6b83c..78fd78a78 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -2100,9 +2100,8 @@ parse_spelllang(win_T *wp)
     for (splp = spl_copy; *splp != NUL; )
     {
        // Get one language name.
-       copy_option_part(&splp, lang, MAXWLEN, ",");
+       len = copy_option_part(&splp, lang, MAXWLEN, ",");
        region = NULL;
-       len = (int)STRLEN(lang);
 
        if (!valid_spelllang(lang))
            continue;
@@ -2248,8 +2247,8 @@ parse_spelllang(win_T *wp)
        else
        {
            // One entry in 'spellfile'.
-           copy_option_part(&spf, spf_name, MAXPATHL - 4, ",");
-           STRCAT(spf_name, ".spl");
+           len = copy_option_part(&spf, spf_name, MAXPATHL - 4, ",");
+           STRCPY(spf_name + len, ".spl");
 
            // If it was already found above then skip it.
            for (c = 0; c < ga.ga_len; ++c)
diff --git a/src/spellfile.c b/src/spellfile.c
index 53243c8da..7c105cf79 100644
--- a/src/spellfile.c
+++ b/src/spellfile.c
@@ -6377,8 +6377,7 @@ spell_add_word(
     static void
 init_spellfile(void)
 {
-    char_u     *buf;
-    int                l;
+    string_T   buf;
     char_u     *fname;
     char_u     *rtp;
     char_u     *lend;
@@ -6388,10 +6387,12 @@ init_spellfile(void)
     if (*curwin->w_s->b_p_spl == NUL || curwin->w_s->b_langp.ga_len <= 0)
        return;
 
-    buf = alloc(MAXPATHL);
-    if (buf == NULL)
+    buf.string = alloc(MAXPATHL);
+    if (buf.string == NULL)
        return;
 
+    buf.length = 0;
+
     // Find the end of the language name.  Exclude the region.  If there
     // is a path separator remember the start of the tail.
     for (lend = curwin->w_s->b_p_spl; *lend != NUL
@@ -6410,51 +6411,51 @@ init_spellfile(void)
        if (aspath)
            // Use directory of an entry with path, e.g., for
            // "/dir/lg.utf-8.spl" use "/dir".
-           vim_strncpy(buf, curbuf->b_s.b_p_spl,
+           vim_strncpy(buf.string, curbuf->b_s.b_p_spl,
                    lstart - curbuf->b_s.b_p_spl - 1);
        else
            // Copy the path from 'runtimepath' to buf[].
-           copy_option_part(&rtp, buf, MAXPATHL, ",");
-       if (filewritable(buf) == 2)
+           buf.length = (size_t)copy_option_part(&rtp, buf.string, MAXPATHL, 
",");
+       if (filewritable(buf.string) == 2)
        {
            // Use the first language name from 'spelllang' and the
            // encoding used in the first loaded .spl file.
            if (aspath)
-               vim_strncpy(buf, curbuf->b_s.b_p_spl,
-                       lend - curbuf->b_s.b_p_spl);
+           {
+               buf.length = (size_t)(lend - curbuf->b_s.b_p_spl);
+               vim_strncpy(buf.string, curbuf->b_s.b_p_spl, buf.length);
+           }
            else
            {
                // Create the "spell" directory if it doesn't exist yet.
-               l = (int)STRLEN(buf);
-               vim_snprintf((char *)buf + l, MAXPATHL - l, "/spell");
-               if (filewritable(buf) != 2)
+               buf.length += vim_snprintf_safelen((char *)buf.string + 
buf.length,
+                   MAXPATHL - buf.length, "/spell");
+               if (filewritable(buf.string) != 2)
                {
-                   if (vim_mkdir(buf, 0755) != 0)
+                   if (vim_mkdir(buf.string, 0755) != 0)
                    {
-                       vim_free(buf);
+                       vim_free(buf.string);
                        return;
                    }
                }
 
-               l = (int)STRLEN(buf);
-               vim_snprintf((char *)buf + l, MAXPATHL - l,
-                       "/%.*s", (int)(lend - lstart), lstart);
+               buf.length += vim_snprintf_safelen((char *)buf.string + 
buf.length,
+                   MAXPATHL - buf.length, "/%.*s", (int)(lend - lstart), 
lstart);
            }
-           l = (int)STRLEN(buf);
            fname = LANGP_ENTRY(curwin->w_s->b_langp, 0)
                ->lp_slang->sl_fname;
-           vim_snprintf((char *)buf + l, MAXPATHL - l, ".%s.add",
-                   fname != NULL
-                   && strstr((char *)gettail(fname), ".ascii.") != NULL
+           vim_snprintf((char *)buf.string + buf.length, MAXPATHL - buf.length,
+               ".%s.add",
+               fname != NULL && strstr((char *)gettail(fname), ".ascii.") != 
NULL
                    ? (char_u *)"ascii" : spell_enc());
            set_option_value_give_err((char_u *)"spellfile",
-                   0L, buf, OPT_LOCAL);
+                   0L, buf.string, OPT_LOCAL);
            break;
        }
        aspath = FALSE;
     }
 
-    vim_free(buf);
+    vim_free(buf.string);
 }
 
 
diff --git a/src/version.c b/src/version.c
index c3bae943a..ed08d95c2 100644
--- a/src/version.c
+++ b/src/version.c
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    193,
 /**/
     192,
 /**/
diff --git a/src/viminfo.c b/src/viminfo.c
index ddd1fe792..7de591f1b 100644
--- a/src/viminfo.c
+++ b/src/viminfo.c
@@ -386,19 +386,18 @@ removable(char_u *name)
 {
     char_u  *p;
     char_u  part[51];
+    int            part_len;
     int            retval = FALSE;
-    size_t  n;
 
     name = home_replace_save(NULL, name);
     if (name == NULL)
        return FALSE;
     for (p = p_viminfo; *p; )
     {
-       copy_option_part(&p, part, 51, ", ");
+       part_len = copy_option_part(&p, part, sizeof(part), ", ");
        if (part[0] == 'r')
        {
-           n = STRLEN(part + 1);
-           if (MB_STRNICMP(part + 1, name, n) == 0)
+           if (MB_STRNICMP(part + 1, name, part_len - 1) == 0)
            {
                retval = TRUE;
                break;

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1w2wpG-00Bzs0-7O%40256bit.org.

Raspunde prin e-mail lui