aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-04-20 19:31:00 +0800
committerGitHub <noreply@github.com>2024-04-20 19:31:00 +0800
commit0ea38c9a53dfcff17703ea22f701ed1cc5bbd7d3 (patch)
tree60fa7289ee8fc164da54b905d030a09671297867
parent4d52b0cf670502caf81b70f2f1e6f8c548b78f58 (diff)
downloadrneovim-0ea38c9a53dfcff17703ea22f701ed1cc5bbd7d3.tar.gz
rneovim-0ea38c9a53dfcff17703ea22f701ed1cc5bbd7d3.tar.bz2
rneovim-0ea38c9a53dfcff17703ea22f701ed1cc5bbd7d3.zip
refactor: add xmemcpyz() and use it in place of some xstrlcpy() (#28422)
Problem: Using xstrlcpy() when the exact length of the string to be copied is known is not ideal because it requires adding 1 to the length and an unnecessary strlen(). Solution: Add xmemcpyz() and use it in place of such xstrlcpy() calls.
-rw-r--r--runtime/doc/dev_vimpatch.txt2
-rwxr-xr-xsrc/clint.py4
-rw-r--r--src/nvim/change.c2
-rw-r--r--src/nvim/cmdexpand.c4
-rw-r--r--src/nvim/eval/userfunc.c2
-rw-r--r--src/nvim/ex_session.c2
-rw-r--r--src/nvim/file_search.c2
-rw-r--r--src/nvim/fold.c2
-rw-r--r--src/nvim/getchar.c4
-rw-r--r--src/nvim/mapping.c4
-rw-r--r--src/nvim/memory.c17
-rw-r--r--src/nvim/ops.c2
-rw-r--r--src/nvim/os/env.c2
-rw-r--r--src/nvim/os/fs.c2
-rw-r--r--src/nvim/os/stdpaths.c2
-rw-r--r--src/nvim/path.c2
-rw-r--r--src/nvim/regexp.c2
-rw-r--r--src/nvim/runtime.c4
-rw-r--r--src/nvim/spell.c8
-rw-r--r--src/nvim/spellfile.c12
-rw-r--r--src/nvim/spellsuggest.c12
-rw-r--r--src/nvim/syntax.c4
-rw-r--r--src/nvim/tag.c10
23 files changed, 61 insertions, 46 deletions
diff --git a/runtime/doc/dev_vimpatch.txt b/runtime/doc/dev_vimpatch.txt
index 1f48324d46..d6e4ced054 100644
--- a/runtime/doc/dev_vimpatch.txt
+++ b/runtime/doc/dev_vimpatch.txt
@@ -185,7 +185,7 @@ information.
mch_memmove memmove
vim_memset copy_chars copy_spaces memset
vim_strbyte strchr
- vim_strncpy strncpy xstrlcpy
+ vim_strncpy strncpy xstrlcpy/xmemcpyz
vim_strcat strncat xstrlcat
VIM_ISWHITE ascii_iswhite
IS_WHITE_OR_NUL ascii_iswhite_or_nul
diff --git a/src/clint.py b/src/clint.py
index 9bca634171..41058469b1 100755
--- a/src/clint.py
+++ b/src/clint.py
@@ -1989,12 +1989,12 @@ def CheckLanguage(filename, clean_lines, linenum, error):
match = Search(r'\b(strncpy|STRNCPY)\b', line)
if match:
error(filename, linenum, 'runtime/printf', 4,
- 'Use xstrlcpy or snprintf instead of %s (unless this is from Vim)'
+ 'Use xstrlcpy, xmemcpyz or snprintf instead of %s (unless this is from Vim)'
% match.group(1))
match = Search(r'\b(strcpy)\b', line)
if match:
error(filename, linenum, 'runtime/printf', 4,
- 'Use xstrlcpy or snprintf instead of %s' % match.group(1))
+ 'Use xstrlcpy, xmemcpyz or snprintf instead of %s' % match.group(1))
match = Search(r'\b(STRNCAT|strncat|strcat|vim_strcat)\b', line)
if match:
error(filename, linenum, 'runtime/printf', 4,
diff --git a/src/nvim/change.c b/src/nvim/change.c
index d76baaff2c..0355f7bf3d 100644
--- a/src/nvim/change.c
+++ b/src/nvim/change.c
@@ -1490,7 +1490,7 @@ bool open_line(int dir, int flags, int second_line_indent, bool *did_do_comment)
leader = xmalloc((size_t)bytes);
allocated = leader; // remember to free it later
- xstrlcpy(leader, saved_line, (size_t)lead_len + 1);
+ xmemcpyz(leader, saved_line, (size_t)lead_len);
// TODO(vim): handle multi-byte and double width chars
for (int li = 0; li < comment_start; li++) {
diff --git a/src/nvim/cmdexpand.c b/src/nvim/cmdexpand.c
index f172646edf..e5b209d4ab 100644
--- a/src/nvim/cmdexpand.c
+++ b/src/nvim/cmdexpand.c
@@ -1294,7 +1294,7 @@ char *addstar(char *fname, size_t len, int context)
}
} else {
retval = xmalloc(len + 4);
- xstrlcpy(retval, fname, len + 1);
+ xmemcpyz(retval, fname, len);
// Don't add a star to *, ~, ~user, $var or `cmd`.
// * would become **, which walks the whole tree.
@@ -2938,7 +2938,7 @@ void ExpandGeneric(const char *const pat, expand_T *xp, regmatch_T *regmatch, ch
static void expand_shellcmd_onedir(char *buf, char *s, size_t l, char *pat, char ***matches,
int *numMatches, int flags, hashtab_T *ht, garray_T *gap)
{
- xstrlcpy(buf, s, l + 1);
+ xmemcpyz(buf, s, l);
add_pathsep(buf);
l = strlen(buf);
xstrlcpy(buf + l, pat, MAXPATHL - l);
diff --git a/src/nvim/eval/userfunc.c b/src/nvim/eval/userfunc.c
index 7bb115aed1..2a3aec1bc7 100644
--- a/src/nvim/eval/userfunc.c
+++ b/src/nvim/eval/userfunc.c
@@ -345,7 +345,7 @@ int get_lambda_tv(char **arg, typval_T *rettv, evalarg_T *evalarg)
char *p = xmalloc(len);
((char **)(newlines.ga_data))[newlines.ga_len++] = p;
STRCPY(p, "return ");
- xstrlcpy(p + 7, start, (size_t)(end - start) + 1);
+ xmemcpyz(p + 7, start, (size_t)(end - start));
if (strstr(p + 7, "a:") == NULL) {
// No a: variables are used for sure.
flags |= FC_NOARGS;
diff --git a/src/nvim/ex_session.c b/src/nvim/ex_session.c
index 416f18ccc5..0e5d2fe4f5 100644
--- a/src/nvim/ex_session.c
+++ b/src/nvim/ex_session.c
@@ -1138,7 +1138,7 @@ static char *get_view_file(char c)
}
*s++ = '=';
*s++ = c;
- xstrlcpy(s, ".vim", 5);
+ xmemcpyz(s, S_LEN(".vim"));
xfree(sname);
return retval;
diff --git a/src/nvim/file_search.c b/src/nvim/file_search.c
index ed4848b402..a8b0dbddee 100644
--- a/src/nvim/file_search.c
+++ b/src/nvim/file_search.c
@@ -291,7 +291,7 @@ void *vim_findfile_init(char *path, char *filename, char *stopdirs, int level, i
if (!vim_isAbsName(rel_fname) && len + 1 < MAXPATHL) {
// Make the start dir an absolute path name.
- xstrlcpy(ff_expand_buffer, rel_fname, len + 1);
+ xmemcpyz(ff_expand_buffer, rel_fname, len);
search_ctx->ffsc_start_dir = FullName_save(ff_expand_buffer, false);
} else {
search_ctx->ffsc_start_dir = xmemdupz(rel_fname, len);
diff --git a/src/nvim/fold.c b/src/nvim/fold.c
index be3295c44c..59a4dc6aad 100644
--- a/src/nvim/fold.c
+++ b/src/nvim/fold.c
@@ -1617,7 +1617,7 @@ static void foldAddMarker(buf_T *buf, pos_T pos, const char *marker, size_t mark
STRCPY(newline, line);
// Append the marker to the end of the line
if (p == NULL || line_is_comment) {
- xstrlcpy(newline + line_len, marker, markerlen + 1);
+ xmemcpyz(newline + line_len, marker, markerlen);
added = markerlen;
} else {
STRCPY(newline + line_len, cms);
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index 66c7e848be..7c12737c98 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -271,7 +271,7 @@ static void add_buff(buffheader_T *const buf, const char *const s, ptrdiff_t sle
size_t len;
if (buf->bh_space >= (size_t)slen) {
len = strlen(buf->bh_curr->b_str);
- xstrlcpy(buf->bh_curr->b_str + len, s, (size_t)slen + 1);
+ xmemcpyz(buf->bh_curr->b_str + len, s, (size_t)slen);
buf->bh_space -= (size_t)slen;
} else {
if (slen < MINIMAL_SIZE) {
@@ -281,7 +281,7 @@ static void add_buff(buffheader_T *const buf, const char *const s, ptrdiff_t sle
}
buffblock_T *p = xmalloc(offsetof(buffblock_T, b_str) + len + 1);
buf->bh_space = len - (size_t)slen;
- xstrlcpy(p->b_str, s, (size_t)slen + 1);
+ xmemcpyz(p->b_str, s, (size_t)slen);
p->b_next = buf->bh_curr->b_next;
buf->bh_curr->b_next = p;
diff --git a/src/nvim/mapping.c b/src/nvim/mapping.c
index 43a4c10ea7..ad02a060a2 100644
--- a/src/nvim/mapping.c
+++ b/src/nvim/mapping.c
@@ -347,7 +347,7 @@ static void set_maparg_rhs(const char *const orig_rhs, const size_t orig_rhs_len
if (rhs_lua == LUA_NOREF) {
mapargs->orig_rhs_len = orig_rhs_len;
mapargs->orig_rhs = xcalloc(mapargs->orig_rhs_len + 1, sizeof(char));
- xstrlcpy(mapargs->orig_rhs, orig_rhs, mapargs->orig_rhs_len + 1);
+ xmemcpyz(mapargs->orig_rhs, orig_rhs, mapargs->orig_rhs_len);
if (STRICMP(orig_rhs, "<nop>") == 0) { // "<Nop>" means nothing
mapargs->rhs = xcalloc(1, sizeof(char)); // single NUL-char
mapargs->rhs_len = 0;
@@ -477,7 +477,7 @@ static int str_to_mapargs(const char *strargs, bool is_unmap, MapArguments *mapa
return 1;
}
char lhs_to_replace[256];
- xstrlcpy(lhs_to_replace, to_parse, orig_lhs_len + 1);
+ xmemcpyz(lhs_to_replace, to_parse, orig_lhs_len);
size_t orig_rhs_len = strlen(rhs_start);
if (!set_maparg_lhs_rhs(lhs_to_replace, orig_lhs_len,
diff --git a/src/nvim/memory.c b/src/nvim/memory.c
index 37e53e4453..64deedefe5 100644
--- a/src/nvim/memory.c
+++ b/src/nvim/memory.c
@@ -202,7 +202,7 @@ void *xmallocz(size_t size)
}
void *ret = xmalloc(total_size);
- ((char *)ret)[size] = 0;
+ ((char *)ret)[size] = '\0';
return ret;
}
@@ -222,6 +222,21 @@ void *xmemdupz(const void *data, size_t len)
return memcpy(xmallocz(len), data, len);
}
+/// Duplicates `len` bytes of `src` to `dst` and zero terminates it.
+/// and returns a pointer to the allocated memory. If the allocation fails,
+/// the program dies.
+///
+/// @see {xstrlcpy}
+/// @param[out] dst Buffer to store the result.
+/// @param[in] src Buffer to be copied.
+/// @param[in] len Number of bytes to be copied.
+void *xmemcpyz(void *dst, const void *src, size_t len)
+{
+ memcpy(dst, src, len);
+ ((char *)dst)[len] = '\0';
+ return dst;
+}
+
#ifndef HAVE_STRNLEN
size_t xstrnlen(const char *s, size_t n)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE
diff --git a/src/nvim/ops.c b/src/nvim/ops.c
index 2decb11d25..eba3e98357 100644
--- a/src/nvim/ops.c
+++ b/src/nvim/ops.c
@@ -2476,7 +2476,7 @@ int op_change(oparg_T *oap)
// Subsequent calls to ml_get() flush the firstline data - take a
// copy of the inserted text.
char *ins_text = xmalloc((size_t)ins_len + 1);
- xstrlcpy(ins_text, firstline + bd.textcol, (size_t)ins_len + 1);
+ xmemcpyz(ins_text, firstline + bd.textcol, (size_t)ins_len);
for (linenr_T linenr = oap->start.lnum + 1; linenr <= oap->end.lnum;
linenr++) {
block_prep(oap, &bd, linenr, true);
diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c
index 8a81f6e928..ed55f4f0eb 100644
--- a/src/nvim/os/env.c
+++ b/src/nvim/os/env.c
@@ -1195,7 +1195,7 @@ bool os_setenv_append_path(const char *fname)
const char *tail = path_tail_with_sep((char *)fname);
size_t dirlen = (size_t)(tail - fname);
assert(tail >= fname && dirlen + 1 < sizeof(os_buf));
- xstrlcpy(os_buf, fname, dirlen + 1);
+ xmemcpyz(os_buf, fname, dirlen);
const char *path = os_getenv("PATH");
const size_t pathlen = path ? strlen(path) : 0;
const size_t newlen = pathlen + dirlen + 2;
diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c
index aa344d786c..2eca906d4e 100644
--- a/src/nvim/os/fs.c
+++ b/src/nvim/os/fs.c
@@ -374,7 +374,7 @@ static bool is_executable_in_path(const char *name, char **abspath)
char *e = xstrchrnul(p, ENV_SEPCHAR);
// Combine the $PATH segment with `name`.
- xstrlcpy(buf, p, (size_t)(e - p) + 1);
+ xmemcpyz(buf, p, (size_t)(e - p));
(void)append_path(buf, name, buf_len);
#ifdef MSWIN
diff --git a/src/nvim/os/stdpaths.c b/src/nvim/os/stdpaths.c
index 187a0e0674..e5bdd56fe6 100644
--- a/src/nvim/os/stdpaths.c
+++ b/src/nvim/os/stdpaths.c
@@ -198,7 +198,7 @@ char *get_xdg_home(const XDGVarType idx)
assert(appname_len < (IOSIZE - sizeof("-data")));
if (dir) {
- xstrlcpy(IObuff, appname, appname_len + 1);
+ xmemcpyz(IObuff, appname, appname_len);
#if defined(MSWIN)
if (idx == kXDGDataHome || idx == kXDGStateHome) {
xstrlcat(IObuff, "-data", IOSIZE);
diff --git a/src/nvim/path.c b/src/nvim/path.c
index e3947c54cd..251051a4ac 100644
--- a/src/nvim/path.c
+++ b/src/nvim/path.c
@@ -2445,7 +2445,7 @@ void path_guess_exepath(const char *argv0, char *buf, size_t bufsize)
if (dir_len + 1 > sizeof(NameBuff)) {
continue;
}
- xstrlcpy(NameBuff, dir, dir_len + 1);
+ xmemcpyz(NameBuff, dir, dir_len);
xstrlcat(NameBuff, PATHSEPSTR, sizeof(NameBuff));
xstrlcat(NameBuff, argv0, sizeof(NameBuff));
if (os_can_exe(NameBuff, NULL, false)) {
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c
index 0ce911c91a..e923449abe 100644
--- a/src/nvim/regexp.c
+++ b/src/nvim/regexp.c
@@ -2379,7 +2379,7 @@ char *reg_submatch(int no)
// Within one line: take form start to end col.
len = rsm.sm_mmatch->endpos[no].col - rsm.sm_mmatch->startpos[no].col;
if (round == 2) {
- xstrlcpy(retval, s, (size_t)len + 1);
+ xmemcpyz(retval, s, (size_t)len);
}
len++;
} else {
diff --git a/src/nvim/runtime.c b/src/nvim/runtime.c
index dd9f9370f3..bfe9bb565f 100644
--- a/src/nvim/runtime.c
+++ b/src/nvim/runtime.c
@@ -1628,14 +1628,14 @@ static inline char *add_dir(char *dest, const char *const dir, const size_t dir_
const char *appname = get_appname();
size_t appname_len = strlen(appname);
assert(appname_len < (IOSIZE - sizeof("-data")));
- xstrlcpy(IObuff, appname, appname_len + 1);
+ xmemcpyz(IObuff, appname, appname_len);
#if defined(MSWIN)
if (type == kXDGDataHome || type == kXDGStateHome) {
xstrlcat(IObuff, "-data", IOSIZE);
appname_len += 5;
}
#endif
- xstrlcpy(dest, IObuff, appname_len + 1);
+ xmemcpyz(dest, IObuff, appname_len);
dest += appname_len;
if (suf1 != NULL) {
*dest++ = PATHSEP;
diff --git a/src/nvim/spell.c b/src/nvim/spell.c
index 04c4f47a60..190501028e 100644
--- a/src/nvim/spell.c
+++ b/src/nvim/spell.c
@@ -811,7 +811,7 @@ static void find_word(matchinf_T *mip, int mode)
if (ptr == mip->mi_word) {
spell_casefold(mip->mi_win, ptr, wlen, fword, MAXWLEN);
} else {
- xstrlcpy(fword, ptr, (size_t)endlen[endidxcnt] + 1);
+ xmemcpyz(fword, ptr, (size_t)endlen[endidxcnt]);
}
}
if (!can_compound(slang, fword, mip->mi_compflags)) {
@@ -1810,7 +1810,7 @@ void count_common_word(slang_T *lp, char *word, int len, uint8_t count)
} else if (len >= MAXWLEN) {
return;
} else {
- xstrlcpy(buf, word, (size_t)len + 1);
+ xmemcpyz(buf, word, (size_t)len);
p = buf;
}
@@ -1868,7 +1868,7 @@ int init_syl_tab(slang_T *slang)
}
syl_item_T *syl = GA_APPEND_VIA_PTR(syl_item_T, &slang->sl_syl_items);
- xstrlcpy(syl->sy_chars, s, (size_t)l + 1);
+ xmemcpyz(syl->sy_chars, s, (size_t)l);
syl->sy_len = l;
}
return OK;
@@ -2253,7 +2253,7 @@ static void use_midword(slang_T *lp, win_T *wp)
char *bp = xstrnsave(wp->w_s->b_spell_ismw_mb, (size_t)n + (size_t)l);
xfree(wp->w_s->b_spell_ismw_mb);
wp->w_s->b_spell_ismw_mb = bp;
- xstrlcpy(bp + n, p, (size_t)l + 1);
+ xmemcpyz(bp + n, p, (size_t)l);
}
p += l;
}
diff --git a/src/nvim/spellfile.c b/src/nvim/spellfile.c
index 45e1b37818..046a0a56e5 100644
--- a/src/nvim/spellfile.c
+++ b/src/nvim/spellfile.c
@@ -2859,7 +2859,7 @@ static void process_compflags(spellinfo_T *spin, afffile_T *aff, char *compflags
if (flag != 0) {
// Find the flag in the hashtable. If it was used before, use
// the existing ID. Otherwise add a new entry.
- xstrlcpy(key, prevp, (size_t)(p - prevp) + 1);
+ xmemcpyz(key, prevp, (size_t)(p - prevp));
hashitem_T *hi = hash_find(&aff->af_comp, key);
if (!HASHITEM_EMPTY(hi)) {
id = HI2CI(hi)->ci_newID;
@@ -3263,7 +3263,7 @@ static int get_pfxlist(afffile_T *affile, char *afflist, char *store_afflist)
if (get_affitem(affile->af_flagtype, &p) != 0) {
// A flag is a postponed prefix flag if it appears in "af_pref"
// and its ID is not zero.
- xstrlcpy(key, prevp, (size_t)(p - prevp) + 1);
+ xmemcpyz(key, prevp, (size_t)(p - prevp));
hashitem_T *hi = hash_find(&affile->af_pref, key);
if (!HASHITEM_EMPTY(hi)) {
int id = HI2AH(hi)->ah_newID;
@@ -3293,7 +3293,7 @@ static void get_compflags(afffile_T *affile, char *afflist, char *store_afflist)
char *prevp = p;
if (get_affitem(affile->af_flagtype, &p) != 0) {
// A flag is a compound flag if it appears in "af_comp".
- xstrlcpy(key, prevp, (size_t)(p - prevp) + 1);
+ xmemcpyz(key, prevp, (size_t)(p - prevp));
hashitem_T *hi = hash_find(&affile->af_comp, key);
if (!HASHITEM_EMPTY(hi)) {
store_afflist[cnt++] = (char)(uint8_t)HI2CI(hi)->ci_newID;
@@ -3481,7 +3481,7 @@ static int store_aff_word(spellinfo_T *spin, char *word, char *afflist, afffile_
// Obey a "COMPOUNDFORBIDFLAG" of the affix: don't
// use the compound flags.
if (use_pfxlist != NULL && ae->ae_compforbid) {
- xstrlcpy(pfx_pfxlist, use_pfxlist, (size_t)use_pfxlen + 1);
+ xmemcpyz(pfx_pfxlist, use_pfxlist, (size_t)use_pfxlen);
use_pfxlist = pfx_pfxlist;
}
@@ -5576,7 +5576,7 @@ static void init_spellfile(void)
if (aspath) {
// Use directory of an entry with path, e.g., for
// "/dir/lg.utf-8.spl" use "/dir".
- xstrlcpy(buf, curbuf->b_s.b_p_spl, (size_t)(lstart - curbuf->b_s.b_p_spl));
+ xmemcpyz(buf, curbuf->b_s.b_p_spl, (size_t)(lstart - curbuf->b_s.b_p_spl - 1));
} else {
// Copy the path from 'runtimepath' to buf[].
copy_option_part(&rtp, buf, MAXPATHL, ",");
@@ -5585,7 +5585,7 @@ static void init_spellfile(void)
// Use the first language name from 'spelllang' and the
// encoding used in the first loaded .spl file.
if (aspath) {
- xstrlcpy(buf, curbuf->b_s.b_p_spl, (size_t)(lend - curbuf->b_s.b_p_spl + 1));
+ xmemcpyz(buf, curbuf->b_s.b_p_spl, (size_t)(lend - curbuf->b_s.b_p_spl));
} else {
// Create the "spell" directory if it doesn't exist yet.
l = (int)strlen(buf);
diff --git a/src/nvim/spellsuggest.c b/src/nvim/spellsuggest.c
index 0cbd3d9795..8bb21a408c 100644
--- a/src/nvim/spellsuggest.c
+++ b/src/nvim/spellsuggest.c
@@ -561,7 +561,7 @@ void spell_suggest(int count)
xstrlcpy(wcopy, stp->st_word, MAXWLEN + 1);
int el = sug.su_badlen - stp->st_orglen;
if (el > 0 && stp->st_wordlen + el <= MAXWLEN) {
- xstrlcpy(wcopy + stp->st_wordlen, sug.su_badptr + stp->st_orglen, (size_t)el + 1);
+ xmemcpyz(wcopy + stp->st_wordlen, sug.su_badptr + stp->st_orglen, (size_t)el);
}
vim_snprintf(IObuff, IOSIZE, "%2d", i + 1);
if (cmdmsg_rl) {
@@ -733,7 +733,7 @@ static void spell_find_suggest(char *badptr, int badlen, suginfo_T *su, int maxc
if (su->su_badlen >= MAXWLEN) {
su->su_badlen = MAXWLEN - 1; // just in case
}
- xstrlcpy(su->su_badword, su->su_badptr, (size_t)su->su_badlen + 1);
+ xmemcpyz(su->su_badword, su->su_badptr, (size_t)su->su_badlen);
spell_casefold(curwin, su->su_badptr, su->su_badlen, su->su_fbadword,
MAXWLEN);
@@ -1367,9 +1367,9 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char *fword, bool soun
compflags[sp->ts_complen] = (uint8_t)((unsigned)flags >> 24);
compflags[sp->ts_complen + 1] = NUL;
- xstrlcpy(preword + sp->ts_prewordlen,
+ xmemcpyz(preword + sp->ts_prewordlen,
tword + sp->ts_splitoff,
- (size_t)(sp->ts_twordlen - sp->ts_splitoff) + 1);
+ (size_t)(sp->ts_twordlen - sp->ts_splitoff));
// Verify CHECKCOMPOUNDPATTERN rules.
if (match_checkcompoundpattern(preword, sp->ts_prewordlen,
@@ -2646,8 +2646,8 @@ static int stp_sal_score(suggest_T *stp, suginfo_T *su, slang_T *slang, char *ba
// Add part of the bad word to the good word, so that we soundfold
// what replaces the bad word.
STRCPY(goodword, stp->st_word);
- xstrlcpy(goodword + stp->st_wordlen,
- su->su_badptr + su->su_badlen - lendiff, (size_t)lendiff + 1);
+ xmemcpyz(goodword + stp->st_wordlen,
+ su->su_badptr + su->su_badlen - lendiff, (size_t)lendiff);
pgood = goodword;
} else {
pgood = stp->st_word;
diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c
index 76824879d7..b63d2a729d 100644
--- a/src/nvim/syntax.c
+++ b/src/nvim/syntax.c
@@ -2733,7 +2733,7 @@ static int check_keyword_id(char *const line, const int startcol, int *const end
// Must make a copy of the keyword, so we can add a NUL and make it
// lowercase.
char keyword[MAXKEYWLEN + 1]; // assume max. keyword len is 80
- xstrlcpy(keyword, kwp, (size_t)kwlen + 1);
+ xmemcpyz(keyword, kwp, (size_t)kwlen);
keyentry_T *kp = NULL;
@@ -4949,7 +4949,7 @@ static int get_id_list(char **const arg, const int keylen, int16_t **const list,
do {
for (end = p; *end && !ascii_iswhite(*end) && *end != ','; end++) {}
char *const name = xmalloc((size_t)(end - p) + 3); // leave room for "^$"
- xstrlcpy(name + 1, p, (size_t)(end - p) + 1);
+ xmemcpyz(name + 1, p, (size_t)(end - p));
if (strcmp(name + 1, "ALLBUT") == 0
|| strcmp(name + 1, "ALL") == 0
|| strcmp(name + 1, "TOP") == 0
diff --git a/src/nvim/tag.c b/src/nvim/tag.c
index 7e94a8b124..1c03731048 100644
--- a/src/nvim/tag.c
+++ b/src/nvim/tag.c
@@ -1002,7 +1002,7 @@ static int add_llist_tags(char *tag, int num_matches, char **matches)
if (len > 128) {
len = 128;
}
- xstrlcpy(tag_name, tagp.tagname, (size_t)len + 1);
+ xmemcpyz(tag_name, tagp.tagname, (size_t)len);
tag_name[len] = NUL;
// Save the tag file name
@@ -1468,7 +1468,7 @@ static bool findtags_in_help_init(findtags_state_T *st)
// language name in help_lang[].
i = (int)strlen(st->tag_fname);
if (i > 3 && st->tag_fname[i - 3] == '-') {
- xstrlcpy(st->help_lang, st->tag_fname + i - 2, 3);
+ xmemcpyz(st->help_lang, st->tag_fname + i - 2, 2);
} else {
STRCPY(st->help_lang, "en");
}
@@ -2015,7 +2015,7 @@ static void findtags_add_match(findtags_state_T *st, tagptrs_T *tagpp, findtags_
if (tagpp->command + 2 < temp_end) {
len = (size_t)(temp_end - tagpp->command - 2);
mfp = xmalloc(len + 2);
- xstrlcpy(mfp, tagpp->command + 2, len + 1);
+ xmemcpyz(mfp, tagpp->command + 2, len);
} else {
mfp = NULL;
}
@@ -2023,7 +2023,7 @@ static void findtags_add_match(findtags_state_T *st, tagptrs_T *tagpp, findtags_
} else {
len = (size_t)(tagpp->tagname_end - tagpp->tagname);
mfp = xmalloc(sizeof(char) + len + 1);
- xstrlcpy(mfp, tagpp->tagname, len + 1);
+ xmemcpyz(mfp, tagpp->tagname, len);
// if wanted, re-read line to get long form too
if (State & MODE_INSERT) {
@@ -3268,7 +3268,7 @@ static int add_tag_field(dict_T *dict, const char *field_name, const char *start
if (len > MAXPATHL - 1) {
len = MAXPATHL - 1;
}
- xstrlcpy(buf, start, (size_t)len + 1);
+ xmemcpyz(buf, start, (size_t)len);
}
buf[len] = NUL;
int retval = tv_dict_add_str(dict, field_name, strlen(field_name), buf);