diff options
-rw-r--r-- | src/nvim/memory.c | 13 | ||||
-rw-r--r-- | src/nvim/memory.h | 13 |
2 files changed, 26 insertions, 0 deletions
diff --git a/src/nvim/memory.c b/src/nvim/memory.c index b6990890a6..238a6791c0 100644 --- a/src/nvim/memory.c +++ b/src/nvim/memory.c @@ -183,6 +183,19 @@ char *xstpncpy(char *restrict dst, const char *restrict src, size_t maxlen) } } +size_t xstrlcpy(char *restrict dst, const char *restrict src, size_t size) +{ + size_t ret = strlen(src); + + if (size) { + size_t len = (ret >= size) ? size - 1 : ret; + memcpy(dst, src, len); + dst[len] = '\0'; + } + + return ret; +} + char *xstrdup(const char *str) { char *ret = strdup(str); diff --git a/src/nvim/memory.h b/src/nvim/memory.h index 2723a7ba80..accf293176 100644 --- a/src/nvim/memory.h +++ b/src/nvim/memory.h @@ -125,6 +125,19 @@ char *xstpcpy(char *restrict dst, const char *restrict src); /// @param maxlen char *xstpncpy(char *restrict dst, const char *restrict src, size_t maxlen); +/// xstrlcpy - Copy a %NUL terminated string into a sized buffer +/// +/// Compatible with *BSD strlcpy: the result is always a valid +/// NUL-terminated string that fits in the buffer (unless, +/// of course, the buffer size is zero). It does not pad +/// out the result like strncpy() does. +/// +/// @param dst Where to copy the string to +/// @param src Where to copy the string from +/// @param size Size of destination buffer +/// @return Length of the source string (i.e.: strlen(src)) +size_t xstrlcpy(char *restrict dst, const char *restrict src, size_t size); + /// Duplicates a chunk of memory using xmalloc /// /// @see {xmalloc} |